如何在 get 请求中将 json 对象作为查询传递
How to pass a json object as a query in a get request
我正在尝试将参数传递给 url get 请求,该请求要求其中一个参数是 json 对象。我正在使用 Google 应用程序脚本。我得到一个无效参数异常。 searchConditions 参数需要 json。我还需要在查询后传递一些额外的参数来指定字段 return.
文档中的示例如下所示:
https://theurl/search?searchConditions=[{ "Param1": "value", "Param2": "value"}]&fields=[ "Field1", "Field2", "etc"]
我的代码如下:
var url = "https:/theurl/search?searchConditions=";
var conditions = {
"Param1":"value",
"Param2":"value"
};
var fields = "&fields=[\'Field1\',\'Field2\',\'etc\']";
var options = {
"method":"Get",
"Accept": "application/json",
"Content-Type": "application/json",
"muteHttpExceptions" : true
};
options.headers = {"Authorization": "Basic xxxxxxxxxxxxx="};
var jsondata = UrlFetchApp.fetch(url + conditions + fields, options);
var data = JSON.parse(jsondata.getContentText())
更新:来自文档:
搜索事件
URI
https://trackerbeyond.phaseware.com:443/pro9/api/incident/search
HTTP 动词
得到
请求参数
有两个请求参数作为 URI 的一部分传入;搜索条件和字段。
searchConditions 参数
这是一组搜索条件。请注意,当定义了多个条件时,必须满足所有条件才能return编辑事件。
此 table 显示要在每个搜索条件中设置的字段。
字段名 描述
ConditionType 可能的值:Exact、BeginsWith、Contains、DateRange、IsBlank、IsNotBlank、ArchiveStatus、OpenCloseStatus。
FieldName 要搜索的字段的名称。要获取完整的字段列表,请使用事件架构 API 调用。
TableName 字段所在的 table 的名称。可能的值为 z_Incident、UserIncident、z_FullTextMain、Customer、UserCustomer、Contacts、UserContacts、CustomerContacts、UserCustomerContacts、CustomerProducts、CustomerSupportPackages、IncidentParts、IncidentParties、DepartmentGroupingMembers(用于在 DepartmentGrouping 上搜索)。如果为空,则将使用 z_Incident。
注意:对于 CreateDate 和 Description 字段,使用 z_FullTextMain 作为 TableName。
Lookup 包含两个字段的对象; LookupTableName 和 LookupFieldName。
SearchValue 要搜索的值。
EndingSearchValue 在指定 DateRange 的 ConditionType 以提供结束日期时使用。
OpenActive 可能的值:全部、OpenOrActive、ClosedOrArchived。请注意,此参数仅在添加 ConditionType 为 OpenCloseStatus 的搜索条件时适用。
例子
在此示例中,第一个搜索条件用于搜索等于 1 的 DepartmentID。第二个条件用于搜索“优先级 3”的优先级描述。这是使用 Lookup 字段搜索描述而不是 id 的示例。第三个条件是包括开放事件和封闭事件。默认情况下,只有打开的事件是 returned。
[
{
“条件类型”:“精确”,
"字段名": "部门ID",
"表名": "",
“抬头”: ””,
"搜索值": "1",
"结束搜索值": "",
"OpenActive": "OpenOrActive"
},
{
“条件类型”:“精确”,
"字段名": "优先级ID",
"表名": "",
“抬头”: {
"LookupTableName": "LU_Priority",
"LookupFieldName": "描述"
},
"SearchValue": "优先级 3",
"结束搜索值": "",
"OpenActive": "OpenOrActive"
},
{
"ConditionType": "打开关闭状态",
"字段名": "",
"表名": "",
“抬头”: ””,
"搜索值": "1",
"结束搜索值": "",
"OpenActive": "全部"
}
]
fields 参数
这是结果中 return 的字段数组。如果此参数留空,则将return编辑一组默认字段。
成功调用测试此 API 接口:https://trackerbeyond.phaseware.com:443/pro9/api/incident/search?searchConditions=[ { "ConditionType": "Exact", "FieldName": "StatusID", "SearchValue": "12", " OpenActive": "OpenOrActive" } ]&fields=[ "CustomerName", "CreateDate", "AgentFullName", "ClosedDateTime", "StatusID", "IncidentID", "Description" ]
修改点:
- 在 GET 方法中,不需要使用
contentType
。
- 如果要使用
Accept
,请在请求中包含header。
- 虽然我不确定您要使用的 API 的规范细节,但从您问题中的
The example in the documentation looks like this: https://theurl/search?searchConditions=[{ "Param1": "value", "Param2": "value"}]&fields=[ "Field1", "Field2", "etc"]
来看,我认为在这种情况下, URL 编码查询参数的值?
当以上几点反映到你的脚本中,就会变成下面这样。
示例脚本:
var url = "https:/theurl/search";
var conditions = [{ "Param1": "value", "Param2": "value" }];
var fields = ["Field1", "Field2", "etc"];
var options = {
"method": "get",
"headers": {
"Authorization": "Basic xxxxxxxxxxxxx=",
"Accept": "application/json",
},
"muteHttpExceptions": true
};
var jsondata = UrlFetchApp.fetch(`${url}?searchConditions=${encodeURIComponent(JSON.stringify(conditions))}&fields=${encodeURIComponent(JSON.stringify(fields))}`, options);
var data = JSON.parse(jsondata.getContentText())
注:
- 在这个答案中,假设
https:/theurl/search
的URL和"Basic xxxxxxxxxxxxx="
的令牌可以用于您要使用的API。请注意这一点。
- 如果以上修改没有解决您的问题,能否提供您要使用的API的官方文档?借此,我想确认一下。
参考文献:
我正在尝试将参数传递给 url get 请求,该请求要求其中一个参数是 json 对象。我正在使用 Google 应用程序脚本。我得到一个无效参数异常。 searchConditions 参数需要 json。我还需要在查询后传递一些额外的参数来指定字段 return.
文档中的示例如下所示:
https://theurl/search?searchConditions=[{ "Param1": "value", "Param2": "value"}]&fields=[ "Field1", "Field2", "etc"]
我的代码如下:
var url = "https:/theurl/search?searchConditions=";
var conditions = {
"Param1":"value",
"Param2":"value"
};
var fields = "&fields=[\'Field1\',\'Field2\',\'etc\']";
var options = {
"method":"Get",
"Accept": "application/json",
"Content-Type": "application/json",
"muteHttpExceptions" : true
};
options.headers = {"Authorization": "Basic xxxxxxxxxxxxx="};
var jsondata = UrlFetchApp.fetch(url + conditions + fields, options);
var data = JSON.parse(jsondata.getContentText())
更新:来自文档:
搜索事件
URI https://trackerbeyond.phaseware.com:443/pro9/api/incident/search
HTTP 动词 得到
请求参数 有两个请求参数作为 URI 的一部分传入;搜索条件和字段。
searchConditions 参数 这是一组搜索条件。请注意,当定义了多个条件时,必须满足所有条件才能return编辑事件。
此 table 显示要在每个搜索条件中设置的字段。 字段名 描述 ConditionType 可能的值:Exact、BeginsWith、Contains、DateRange、IsBlank、IsNotBlank、ArchiveStatus、OpenCloseStatus。 FieldName 要搜索的字段的名称。要获取完整的字段列表,请使用事件架构 API 调用。 TableName 字段所在的 table 的名称。可能的值为 z_Incident、UserIncident、z_FullTextMain、Customer、UserCustomer、Contacts、UserContacts、CustomerContacts、UserCustomerContacts、CustomerProducts、CustomerSupportPackages、IncidentParts、IncidentParties、DepartmentGroupingMembers(用于在 DepartmentGrouping 上搜索)。如果为空,则将使用 z_Incident。 注意:对于 CreateDate 和 Description 字段,使用 z_FullTextMain 作为 TableName。 Lookup 包含两个字段的对象; LookupTableName 和 LookupFieldName。 SearchValue 要搜索的值。 EndingSearchValue 在指定 DateRange 的 ConditionType 以提供结束日期时使用。 OpenActive 可能的值:全部、OpenOrActive、ClosedOrArchived。请注意,此参数仅在添加 ConditionType 为 OpenCloseStatus 的搜索条件时适用。
例子 在此示例中,第一个搜索条件用于搜索等于 1 的 DepartmentID。第二个条件用于搜索“优先级 3”的优先级描述。这是使用 Lookup 字段搜索描述而不是 id 的示例。第三个条件是包括开放事件和封闭事件。默认情况下,只有打开的事件是 returned。 [ { “条件类型”:“精确”, "字段名": "部门ID", "表名": "", “抬头”: ””, "搜索值": "1", "结束搜索值": "", "OpenActive": "OpenOrActive" }, { “条件类型”:“精确”, "字段名": "优先级ID", "表名": "", “抬头”: { "LookupTableName": "LU_Priority", "LookupFieldName": "描述" }, "SearchValue": "优先级 3", "结束搜索值": "", "OpenActive": "OpenOrActive" }, { "ConditionType": "打开关闭状态", "字段名": "", "表名": "", “抬头”: ””, "搜索值": "1", "结束搜索值": "", "OpenActive": "全部" } ]
fields 参数 这是结果中 return 的字段数组。如果此参数留空,则将return编辑一组默认字段。
成功调用测试此 API 接口:https://trackerbeyond.phaseware.com:443/pro9/api/incident/search?searchConditions=[ { "ConditionType": "Exact", "FieldName": "StatusID", "SearchValue": "12", " OpenActive": "OpenOrActive" } ]&fields=[ "CustomerName", "CreateDate", "AgentFullName", "ClosedDateTime", "StatusID", "IncidentID", "Description" ]
修改点:
- 在 GET 方法中,不需要使用
contentType
。 - 如果要使用
Accept
,请在请求中包含header。 - 虽然我不确定您要使用的 API 的规范细节,但从您问题中的
The example in the documentation looks like this: https://theurl/search?searchConditions=[{ "Param1": "value", "Param2": "value"}]&fields=[ "Field1", "Field2", "etc"]
来看,我认为在这种情况下, URL 编码查询参数的值?
当以上几点反映到你的脚本中,就会变成下面这样。
示例脚本:
var url = "https:/theurl/search";
var conditions = [{ "Param1": "value", "Param2": "value" }];
var fields = ["Field1", "Field2", "etc"];
var options = {
"method": "get",
"headers": {
"Authorization": "Basic xxxxxxxxxxxxx=",
"Accept": "application/json",
},
"muteHttpExceptions": true
};
var jsondata = UrlFetchApp.fetch(`${url}?searchConditions=${encodeURIComponent(JSON.stringify(conditions))}&fields=${encodeURIComponent(JSON.stringify(fields))}`, options);
var data = JSON.parse(jsondata.getContentText())
注:
- 在这个答案中,假设
https:/theurl/search
的URL和"Basic xxxxxxxxxxxxx="
的令牌可以用于您要使用的API。请注意这一点。 - 如果以上修改没有解决您的问题,能否提供您要使用的API的官方文档?借此,我想确认一下。