【问题标题】:Post JSON array with IONIC 2/3使用 IONIC 2/3 发布 JSON 数组
【发布时间】:2018-04-01 00:37:22
【问题描述】:

我正在尝试使用带有 IONIC 3 的 HTTP 本机发送 JSON 数组作为参数。这是请求:

 HTTPResponse = await this.http.post(url, 
 body, headers);

这是完整的代码。我正在使用来自“@ionic-native/http”的 HTTP。这是完整的代码

 import { HTTP, HTTPResponse } from '@ionic-native/http';

 [...]

 let body =  '[{"userId": 1, "timestamp":"2018-10-12T18:00:00.000+02", 
 "audit":"MENUTEST"},{"userId": 1, "timestamp":"2018-10-
 12T18:00:00.000+02", "audit":"MENUTEST"},{"userId": 1, 
 "timestamp":"2018-10-12T18:00:00.000+02", "audit":"MENUTEST"}]';

 //Auth header
 let headers = { Authorization: `Bearer ${token}`};

 let httpResponse: HTTPResponse = await 
 this.http.post(URL_data, JSON.parse(body), headers); 

我在其他请求中使用了类似的代码,一切正常,唯一的区别是请求在 JSON 正文中有一个简单的参数。这是正常的请求:

import { HTTP, HTTPResponse } from '@ionic-native/http';

[...]

let body = '{ "username": "usuario.prueba1", "password": "' + 
Md5.hashStr('prueba') + '", "customerCode": "1234DEV" }';

let httpResponse: HTTPResponse = await 
this.http.post(URL_login, JSON.parse(body), headers); 

【问题讨论】:

    标签: ionic-framework ionic3


    【解决方案1】:

    更新答案:

    如果您查看 post 操作的 android 实现的 source-file,您会看到 JsonObject 应作为参数,这就是为什么传递数组将导致 JSON error。您必须将数组包装在这样的对象中才能使其工作:

    let body = {
      myArray: [
        {
          userId: 1,
          timestamp: '2018-10-12T18:00:00.000+02',
          audit: 'MENUTEST',
        },
        {
          userId: 1,
          timestamp: '2018-10-12T18:00:00.000+02',
          audit: 'MENUTEST',
        },
        {
          userId: 1,
          timestamp: '2018-10-12T18:00:00.000+02',
          audit: 'MENUTEST',
        },
      ],
    };
    
    let headers = { Authorization: `Bearer ${token}` };
    let httpResponse: HTTPResponse = await this.http.post(
      URL_data,
      body,
      headers,
    );
    

    旧答案:

    我猜你的Content-Typeapplication/x-www-form-urlencoded,所以你需要为你的参数添加一个名称,用等号(=)与值分隔:

    let payload = [{ "userId": 3, "timestamp": "2018-10-12T18:00:00.000+02", "audit": "Mensaje 3" }, { "userId": 4, "timestamp": "2018-10-13T18:00:00.000+02", "audit": "Mensaje 4" }];
    let body = `MyArray=${payload}`;
    

    规范的相关部分可以找到here。第 2 点说:

    控件名称/值按照它们在文档中出现的顺序列出。名称和值之间用 `=' 分隔,名称/值对之间用 `&' 分隔。

    【讨论】:

    • 我已经编辑了这个问题,以便为您提供更多信息。该问题与 IONIC 3 有关,我需要此框架的有效代码。
    • 啊,您应该提到您使用的是本机 HTTP 插件,请查看更新后的答案。
    • 我已经测试了您的代码,但它对服务器端无效。我尝试通过 REST 客户端发送 JSON,一切正常。但我无法在我的客户端应用程序中创建相同的主体。您的代码包含服务器不期望的 myarray 字段。还有什么想法吗?
    • 那么你必须改变你的服务器端代码以便它可以读取json对象或者你不使用离子原生的http插件。您也可以使用 angulars HttpModule 进行此调用。
    • 最后我使用了 angulars 模块,但我遇到的主要问题是应用程序执行中的 -c -l 参数。这些参数正在修改请求中的行为。内容类型被忽略。非常感谢,但问题可能不在代码中。
    【解决方案2】:

    要支持深层结构,您应该更改序列化程序。 尝试设置http.setDataSerializer("json"); 并照常发送数据:http.post(url, body, {})

    检查这个答案:
    https://stackoverflow.com/a/49589124/6097876

    【讨论】:

      猜你喜欢
      • 2019-03-07
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2019-08-14
      • 2018-07-03
      • 1970-01-01
      • 2018-02-25
      相关资源
      最近更新 更多