如何在 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的官方文档?借此,我想确认一下。

参考文献: