Flutter:为 Http GET 请求发送 JSON 正文

Posted

技术标签:

【中文标题】Flutter:为 Http GET 请求发送 JSON 正文【英文标题】:Flutter: Send JSON body for Http GET request 【发布时间】:2019-08-15 08:08:16 【问题描述】:

我需要从我的 Flutter 应用程序向 API 发出 GET 请求,该请求要求请求正文为 JSON(原始)。

我在 Postman 中使用 JSON 请求正文测试了 API,它似乎工作正常。

现在在我的 Flutter 应用程序上,我正在尝试做同样的事情:

_fetchDoctorAvailability() async 
    var params = 
      "doctor_id": "DOC000506",
      "date_range": "25/03/2019-25/03/2019" ,
      "clinic_id":"LAD000404"
    ;

    Uri uri = Uri.parse("http://theapiiamcalling:8000");
    uri.replace(queryParameters: params);

    var response = await http.get(uri, headers: 
      "Authorization": Constants.APPOINTMENT_TEST_AUTHORIZATION_KEY,
      HttpHeaders.contentTypeHeader: "application/json",
      "callMethod" : "DOCTOR_AVAILABILITY"
    );

    print('---- status code: $response.statusCode');
    var jsonData = json.decode(response.body);

    print('---- slot: $jsonData');

但是 API 给了我一个错误提示

message: Missing input json., status: false

如何在 Flutter 中为 Http GET 请求发送原始(或者更确切地说是 JSON)请求正文?

【问题讨论】:

【参考方案1】:

获取

GET 请求不用于向服务器发送数据(而是see this)。这就是http.dart get 方法没有body 参数的原因。但是,当您要指定从服务器获取的内容时,有时您需要包含查询参数,这是一种数据形式。查询参数是键值对,因此您可以像这样将它们包含为映射:

final queryParameters = 
  'name': 'Bob',
  'age': '87',
;
final uri = Uri.http('www.example.com', '/path', queryParameters);
final headers = HttpHeaders.contentTypeHeader: 'application/json';
final response = await http.get(uri, headers: headers);

发布

与 GET 请求不同,POST 请求用于在正文中发送数据。你可以这样做:

final body = 
  'name': 'Bob',
  'age': '87',
;
final jsonString = json.encode(body);
final uri = Uri.http('www.example.com', '/path');
final headers = HttpHeaders.contentTypeHeader: 'application/json';
final response = await http.post(uri, headers: headers, body: jsonString);

请注意,参数是 Dart 端的 Map。然后它们被 dart:convert 库中的 json.encode() 函数转换为 JSON 字符串。该字符串是 POST 正文。

因此,如果服务器要求您在 GET 请求正文中向其传递数据,请再次检查。虽然可以用这种方式设计服务器,但这不是标准的。

【讨论】:

【参考方案2】:

uri.replace... 返回一个新的Uri,所以你必须将它赋值给一个新的变量或者直接使用到get 函数中。

final newURI = uri.replace(queryParameters: params);

var response = await http.get(newURI, headers: 
  "Authorization": Constants.APPOINTMENT_TEST_AUTHORIZATION_KEY,
  HttpHeaders.contentTypeHeader: "application/json",
  "callMethod" : "DOCTOR_AVAILABILITY"
);

使用帖子:

      var params = 
        "doctor_id": "DOC000506",
        "date_range": "25/03/2019-25/03/2019" ,
        "clinic_id":"LAD000404"
      ;

      var response = await http.post("http://theapiiamcalling:8000", 
      body: json.encode(params)
      ,headers: 
        "Authorization": Constants.APPOINTMENT_TEST_AUTHORIZATION_KEY,
        HttpHeaders.contentTypeHeader: "application/json",
        "callMethod" : "DOCTOR_AVAILABILITY"
      );

【讨论】:

谢谢,现在我不再收到该错误消息,但响应正文返回为空。 也许您应该使用 post 而不是 get 来发送原始数据。 @diegoveloper 如果我们想提交一些数据,我们可以在 get 请求中使用 post 请求中的 body 标签吗?当我以相同的方式发送数据时,我在服务器上接收参数作为查询字符串,例如:someUrl.com/method?param=1 等等...... @diegoveloper:在我看到参数 的每个地方,如果我必须发送 bool,int 也是如此。我该怎么做? 最终 uriL = Uri.http('10.130.34.165:4002/masterRequest','/Get_IFSCDetail' ,queryParameters);在我的代码中,我通过了这个但是给出了 FormatException 的错误:无效的 radix-10 数字【参考方案3】:

如果您想通过如下示例的 GET 请求发送复杂/嵌套数据,您可以使用我在 github 上创建的一个简单类 https://github.com/opatajoshua/SimplifiedUri

final params = 
  'name': 'John',
  'columns': ['firstName', 'lastName'],
  'ageRange': 
    'from': 12,
    'to': 60,
  ,
  'someInnerArray': [1,2,3,5]
;
final Uri uri = SimplifiedUri.uri('http://api.mysite.com/users', params);
final headers = HttpHeaders.contentTypeHeader: 'application/json';
final response = await http.get(uri, headers: headers);

输出

http://api.mysite.com/users?name=John&columns%5B%5D=firstName&columns%5B%5D=lastName&ageRange%5Bfrom%5D=12&ageRange%5Bto%5D=60&someInnerArray%5B%5D=1&someInnerArray%5B%5D=2&someInnerArray%5B%5D=3&someInnerArray%5B%5D=5

【讨论】:

以上是关于Flutter:为 Http GET 请求发送 JSON 正文的主要内容,如果未能解决你的问题,请参考以下文章

Flutter HTTP 发布请求 JSON 处理无法正常工作

Flutter:在 http.get 请求之后构建 ListView

flutter http get请求

Flutter:无法发出 HTTP-GET 请求

Flutter/Dart http POST 重定向通过 GET 发送正文

为 Flutter http 请求设置请求超时的正确方法?