JSON stringify 中的变量在 Rest 请求中不起作用

Posted

技术标签:

【中文标题】JSON stringify 中的变量在 Rest 请求中不起作用【英文标题】:Variable in JSON stringify will not work in Rest request 【发布时间】:2019-08-17 19:31:03 【问题描述】:

我正在尝试向 REST API 发送请求,并且我使用 javascript 来准备和发送它。但是,当我使用 JSON.Stringify 写出对象所需的变量时,API 说我缺少必填字段。

我尝试将对象写入字符串,然后将其包含在代码中,并且我尝试将 JSON.Stringify 添加到代码中。没有任何效果。

我从发布的字段中构建了一个数组“数据”,格式如下:

var Data = ;
var fields;
var fieldName;
var fieldValue;
var fieldValueCleaned;
var emailCleaned;
var stingForJson;
stingForJson = "";
for(var i = 0; i < types.length; i++)

  fields = types[i].split("=");
  fieldName = fields[0];
  fieldValue = CleanupInj(fields[1]);
  fieldValue = decodeURIComponent(fieldValue);
  fieldValueCleaned = CleanUp(fieldValue);

  Data[fieldName] = fieldValueCleaned; 

  console.log( fieldName +" : "+ fieldValueCleaned);



如果我将 JSON.stringify(Data) 写入控制台,它就正确了:


Data: 
        "Field1": "123562374563",
        "Field2": "https://giphy.com/gifs/borat-great-success-a0h7sAqON67nO/fullscreen",
        "Field3": "https://giphy.com/gifs/haZOqHKz9tTfW/fullscreen",
        "Field4": "My@email.com",
        "Field5": "Thisisme"
    

但是,当我将变量添加到代码中以执行请求时,它不起作用(如下所示)

fetch('https://MYAPIURL/v1/events', 
        method: "POST",
        cache: "no-cache",
        headers: 
            "Content-Type": "application/json",
            "Authorization": "Bearer " : "12321321321321",
        ,
        body: JSON.stringify(
          "Field1": Data.Field1,
          "Field5": Data.Field5,

        ),
  Data: JSON.stringify(Data),
    
     )
  .then(function(res) 
    return res.json();
  ).then(function(json) 
    callback(null, json);
  );

它不起作用,因为 Data 中的值没有发送到服务器。

我什至尝试将对象写入字符串,然后使用 JSON.stringify 将其放回 json 对象:

stingForJson = JSON.stringify(Data);
stingForJson = stingForJson.slice(9,-2);
console.log("String for JSON = "+ stingForJson);

fetch('https://mc-hz56jzqd8k6ldx1sm7-s7xfbm.rest.marketingcloudapis.com/interaction/v1/events', 
        method: "POST",
        cache: "no-cache",
        headers: 
            "Content-Type": "application/json",
            "Authorization": "Bearer " + accessToken,
        ,
        body: JSON.stringify(
          "ContactKey": Data.EmailAddress,
          "EventDefinitionKey": Data.EventDefinitionKey,
     Data:stingForJson
        ),

【问题讨论】:

JSON.stringify(Data) 写成 Data: "Field1": "123562374563", "Field2": "giphy.com/gifs/borat-great-success-a0h7sAqON67nO/fullscreen", "Field3": "giphy.com/gifs/haZOqHKz9tTfW/fullscreen" , "Field4": "My@email.com", "Field5": "Thisisme" 当我把它写到控制台时 究竟是什么“不起作用”?你有错误吗? 发送请求时不需要使用 stringify。按原样发送 json 对象,通过线路将其编码。您正在将其转换为字符串然后发送它,这就是为什么服务器没有收到所需的 json 对象。 fetch 忽略您在对象上设置的 Data 属性(see the MDN documentation 用于接受的属性列表)。换句话说,Data 的值不会发送到服务器。您的意思是将其作为body 的一部分发送吗?还是您的意思是改为写body: JSON.stringify(Data) 您的第二个示例应该是:body: JSON.stringify( "ContactKey": Data.EmailAddress, "EventDefinitionKey": Data.EventDefinitionKey, Data)Data:stingForJson 会创建一个看起来像 Data: stringForJSON: "\"foo\": 42" 的对象,这很可能是错误的。 【参考方案1】:

你可能想要:

body: JSON.stringify('Data': Data),

根据https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters 的文档,由于fetch() 不支持Data 属性

虽然JSON.stringify(Data) 似乎产生相同的输出,但我建议使用我的语法,因为外部名称(远程服务期望的名称)独立于变量的名称。

【讨论】:

“我建议使用我的语法,因为它不依赖于找出变量名称的魔法。” 它有什么魔力?没有充分的理由不使用速记属性。事实上,它们可以防止属性名称中的拼写错误(例如'somtehing': something)。 @FelixKling 以前没见过这个,这让我觉得它更像是一个隐藏的功能。我同意你的错字论点,但我更喜欢让我的变量名称独立于我正在与之交谈的接口(内部与外部名称)。 是的,我能理解。 ES2015 (ES6) 中引入了速记属性。

以上是关于JSON stringify 中的变量在 Rest 请求中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 中 JSON.stringify 中的第二个参数

在 JSON.stringify 中使用变量

java中的JSON.stringify - android

JSON.stringify深拷贝的缺点

JSON

将 JSON.stringify 与 TypeScript getter/setter 结合使用