我需要从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。,状态:false}
如何在Flutter中为Http GET请求发送原始(或JSON)请求正文?
答案 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);
与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"
});