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

时间:2019-03-25 05:38:49

标签: json dart flutter

我需要从Flutter应用向API发出GET请求,该请求要求请求主体为JSON(原始)。

我在Postman中用JSON请求主体测试了API,看来工作正常。

enter image description here

现在在我的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给我一个错误提示

  

{消息:缺少输入json。,状态:false}

如何在Flutter中为Http GET请求发送原始(或JSON)请求正文?

2 个答案:

答案 0 :(得分:4)

此答案是对将来的访问者的澄清。

获取

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);

POST

与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。然后,它们由json.encode()库中的dart:convert函数转换为JSON字符串。该字符串是POST正文。

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

答案 1 :(得分:1)

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"
      });