通过 rest 调用将 json 作为查询正文发送

Posted

技术标签:

【中文标题】通过 rest 调用将 json 作为查询正文发送【英文标题】:Send json as query body via rest call 【发布时间】:2020-09-23 21:49:15 【问题描述】:

我需要通过rest发送json的请求,客户端(rest)的代码是Node,服务端的代码是golang。

身体如下图

const query = "\"query\":\"query n  result: application(id: \"fb7b5992-4d0a-4782-acb7-13ae6cc66102\") n    idn    namen    providerNamen    descriptionn    integrationSystemIDn    labelsn    status n      conditionn      timestamptn    n\""

当我运行代码时,我从服务器收到以下错误 (go) 我用

这是电话

const app = await fetch(`https://eway-auth-oauth.kh.de-arch.sho.ca.k8s-han.znd.com/dir/graphql`, 
    method: 'post',
    body: queryBody,
    headers: 
        'Accept-Encoding': 'gzip, deflate, br',
        'Content-Type': 'application/json',
        'Accept': 'application/json',
        'Connection': 'keep-alive',
        'DNT': '1',
        'Origin': 'https://eway-auth.kh.devx-ar.znd.com',
        'authorization': 'Bearer xxxxxxxxxxxxxxx',
        'tenant': '3e6rezae-38b5-46a0-b1ed-9ccee153a0am'
    
);
return 
    ky: await app.json(),

错误

json body could not be decoded: invalid character 'z' after object key:value pair

zapplication(id:z.... 中的起始后者 这是我需要发送的号码。

知道我该如何克服这个问题吗?我挣扎了两天

顺便说一句,

当我尝试使用 curl 命令时,它可以工作,当我将数据从终端复制到 js 变量 query 时出现错误,不确定方式:(

更新

这是 适合我的 curl(上面的代码不...)

curl `https://eway-auth-oauth.kh.de-arch.sho.ca.k8s-han.znd.com/dir/graphql` \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Connection: keep-alive' \
-H 'DNT: 1' \
-H 'Origin: https://eway-auth.kh.devx-ar.znd.com \
-H 'authorization: Bearer xxxxxxxxxxxxxxx' \
-H 'tenant: 3e6rezae-38b5-46a0-b1ed-9ccee153a0am' \
--data-binary '\”query\":\"query \n  result: application(id: \"fb7b5992-4d0a-4782-acb7-13ae6cc66102\") \n    id\n    name\n    providerName\n    description\n    integrationSystemID\n    labels\n    status \n      condition\n      timestampt\n    \n\n\n\"'
 \
--compressed

【问题讨论】:

queryBody 中应该包含的内容 那不是 json,而是 javascript 或一些字符串。这就是为什么它不起作用。 fetch 方法的选项部分,即 json。 + 你能正确格式化你的身体吗?目前很难阅读。 你正在字符串化一个字符串? 如果您需要帮助,请发布 Go 代码。否则,删除 Go 标记。 试试这个:const query = "query":"query \n result: application(id: \"fb7b5992-4d0a-4782-acb7-13ae6cc66102\") \n id\n name\n providerName\n description\n integrationSystemID\n labels\n status \n condition\n timestampt\n \n\n\n" 这至少是正确的转义 json。还有queryBody = JSON.stringify(query) 【参考方案1】:

json 在您的字符串表示形式中未正确转义。特别是有必要转义值中的引号并转义反斜杠。 这意味着" => \" 或者,如果已经转义,\" => \\\" 和例如\n => \\n.

您可以将 json 直接分配给查询。在这种情况下,如果 json 无效,您的 IDE 通常已经在抱怨。

const query = 
  "query": "query \n  result: application(id: \"fb7b5992-4d0a-4782-acb7-13ae6cc66102\") \n    id\n    name\n    providerName\n    description\n    integrationSystemID\n    labels\n    status \n      condition\n      timestampt\n    \n\n\n"
;

您也可以使用' 来避免转义。在大多数情况下,这不应该有所作为。即使我不确定您在后端的解析器是否可以正常使用。

const query = 
  "query": "query \n  result: application(id: 'fb7b5992-4d0a-4782-acb7-13ae6cc66102') \n    id\n    name\n    providerName\n    description\n    integrationSystemID\n    labels\n    status \n      condition\n      timestampt\n    \n\n\n"
;

之后您需要将其作为字符串传递给您的 http 请求:

const queryBody = JSON.stringify(query);

【讨论】:

以上是关于通过 rest 调用将 json 作为查询正文发送的主要内容,如果未能解决你的问题,请参考以下文章

我应该通过 HTTP 标头或将正文作为 JSON 传递到 REST Api 吗?

带有完美消息的 JSON 模式验证

如何将请求正文中的列表值发送到 Rest Api

如何使用JSON正文在REST API POST方法中传递多个记录

如何通过 HttpClient 在 POST 请求中将 JSON 数据作为正文发送

REST 查询的响应正文中缺少 JSON 数据