6

我试图从角度发送一个 json 结构到一个休息服务,做这样的事情

  let test5var = {
                    "test5var1": {
                        "test5var2": "0317",
                        "test5var3": "9556"
                    },
                    "test5var4": "123",
                    "test5var": "0000046"
                }
let dataPrincipalBlnc = {"test": {"test1": {"test2": "0317","test3": {"IDIOMA_ISO": " en","DIALECTO_ISO": "US"},"channel": "INT"},"input": {"test5": test5var}}};

let headers = new HttpHeaders();
    headers.append('Content-Type', 'application/json');

    let params = new HttpParams().set("requestData", dataPrincipalBlnc.toString()).set("authenticationType", this.authType);


    return this.http.get(this.url, {params: params}); 

请求的结果应如下所示:

https://example.com/test?authenticationType=cookie&requestData=%7B%test%22:%7B%22test1%22:%7B%22test2%22:%220317%22,%22test3%22:%7B%22IDIOMA_ISO% 22:%22+en%22,%22DIALECTO_ISO%22:%22US%22%7D,%22channel%22:%22INT%22%7D,%22input%22:%7B%22test5%22:%7B%22test5var1% 22:%7B%22test5var2%22:%220317%22,%22test5var3%22:%229556%22%7D,%22test5var4%22:%22123%22,%22test5var5%22:%220000986%22%7D%7D% 7D%7D

但它目前被发送为:

https://example.com/test?requestData=%5Bobject%20Object%5D&authenticationType=cookie

任何想法如何将 json 对象发送为第一个请求?我需要手动将 json 转换为有效的 uri 格式吗?

在 angularJS 中,只需使用以下代码即可正常工作:

var data = {
      "test1": {
        "test2": {
          "test3": "0317",
          "test4": {
            "IDIOMA_ISO": " en",
            "DIALECTO_ISO": "US"
          },
          "channel": "INT"
        },
        "input": {
          "test5": test5var
        }
      }
};
$http.get(url, {
      params: {
        authenticationType: authType,
        requestData: data
      }
    }).then(success(deferred), error(deferred));

我也尝试过使用以下代码,但结果是添加了更多字符并且后端失败了,因为它说 JSON 格式无效:

encodeURIComponent(JSON.stringify(dataPrincipalBlnc)

?requestData=%257B%2522test%2522%253A%257B%2522test1%2522%253A%257B%2522test2%2522%253A%25220317%2522%252C%2522test3%2522%253A%257B%25222522IDIOMA_ISO52%252%2522IDIOMA_ISO%252% 2520en%2522%252C%2522DIALECTO_ISO%2522%253A%2522US%2522%257D%252C%2522channel%2522%253A%2522INT%2522%257D%252C%2522input%2522%253A%257B%2522test5%B22%2522test5%B22%5 2522test5var1%2522%253A%257B%2522test5var2%2522%253A%25220317%2522%252C%2522test5var4%2522%253A%25229556%2522%257D%252C%2522test5var4%2522%253A%2522123%2522%252C%2522test5var5%2522% 253A%25220003303%2522%257D%257D%257D%257D&authenticationType=cookie

感谢和问候

4

3 回答 3

6

传递给服务的任何 JSON 对象都应通过响应正文发送。您应该只在 url 中添加有效的字符串参数。

大多数浏览器也存在url 大小限制,因此较大的对象可能会导致您遇到长 url 问题。

您看到的是 requestData=%5Bobject%20Object%5D&authenticationType=cookie因为它无法将 JSON 对象放入 url查询字符串中。

一些字符不能成为 URL 的一部分(例如空格),而另一些字符在 URL 中具有特殊含义:例如,字符 # 可用于进一步指定文档的小节(或片段);字符 = 用于将名称与值分开。可能需要转换查询字符串以满足这些约束。这可以使用称为URL 编码的模式来完成。

JSON.stringify当您有一个 JavaScript 对象并且想要将其转换为字符串(包含 JSON 文本)时使用。这称为序列化。

不管 JSON:

每当您想在 URL 中发送“有问题的”字符时使用encodeURIComponent,例如&、%等。相反的是decodeURIComponent.

我仍然希望在请求正文中发送对象。

所以在你的情况下使用:

 let params = new HttpParams()
                .set("requestData", encodeURIComponent(JSON.stringify(dataPrincipalBlnc)))
                .set("authenticationType", this.authType);
于 2019-01-15T19:17:42.837 回答
2

添加到@nircraft 答案(非常精细且很好)这个实现似乎对你有用,

let test5var = {
                "test5var1": {
                    "test5var2": "0317",
                    "test5var3": "9556"
                },
                "test5var4": "123",
                "test5var": "0000046"
            }
let dataPrincipalBlnc = '{"test": {"test1": {"test2": "0317","test3": {"IDIOMA_ISO": " en","DIALECTO_ISO": "US"},"channel": "INT"},"input": {"test5": test5var}}}';

let headers = new HttpHeaders();
headers.append('Content-Type', 'application/json');

let params = new HttpParams().set("requestData", encodeURIComponent(dataPrincipalBlnc)).set("authenticationType", this.authType);


return this.http.get(this.url, {params: params}); 

在 Javascript 中,您基本上可以在''or中包含一个字符串""

当您没有专门将字符串括起来时,我相信它是用 括起来的"",因此当您使用 stringify 时,您的 JSON 响应需要转义字符。

像这样将字符串括起来将确保双引号将确保它不需要转义字符。

如果您有任何问题,请告诉我。

于 2019-01-15T20:04:11.530 回答
0

我刚刚通过将数据定义为对象并仅使用 JSON.stringify 解决了这个问题:

let dataPrincipalBlnc: object;

let dataPrincipalBlnc = {"test": {"test1": {"test2": "0317","test3": {"IDIOMA_ISO": " en","DIALECTO_ISO": "US"},"channel": "INT"},"input": {"test5": test5var}}};

let params = new HttpParams().set("requestData", JSON.stringify(dataPrincipalBlnc)).set("authenticationType", this.authType);

感谢您的帮助问候

于 2019-01-15T20:34:09.827 回答