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

zed5wv10  于 2022-12-30  发布在  Flutter
关注(0)|答案(5)|浏览(203)

我需要从我的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给了我一个错误消息
{消息:缺少输入json.,状态:假}
如何在Flutter中发送Http GET请求的原始(或者更确切地说是JSON)请求体?

voj3qocg

voj3qocg1#

获取

GET请求不用于向服务器发送数据(但是see this)。这就是http.dartget方法没有body参数的原因。但是,当你想指定你从服务器得到什么时,有时候你需要包括查询参数,这是一种数据形式。查询参数是键-值对,因此您可以将它们作为Map包括在内,如下所示:

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,然后通过dart:convert库中的json.encode()函数将其转换为JSON字符串,该字符串就是POST主体。
因此,如果服务器要求你在GET请求体中传递数据,请再次检查。虽然可以用这种方式设计服务器,但它不是标准的。

z6psavjg

z6psavjg2#

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

使用post:

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

blmhpbnm3#

可以按如下方式使用Request类:

var request = http.Request(
  'GET',
  Uri.parse("http://theapiiamcalling:8000"),
)..headers.addAll({
    "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"
};
request.body = jsonEncode(params);
http.StreamedResponse response = await request.send();
print(response.statusCode);
print(await response.stream.bytesToString());

另外,请注意, Postman 可以convert an API request into a code snippet在超过15种语言。如果你选择 dart ,你会发现一个类似的代码以上。

1u4esq0p

1u4esq0p4#

它可能会帮助那些使用Getx进行API集成的人。我们可以使用请求方法来满足这些需求。

Map<String, dynamic>  requestBody = { 'id' : 1};
 Response<Map<String, dynamic>> response =
      await request(url, 'get', body: requestBody);
dauxcl2d

dauxcl2d5#

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

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

相关问题