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:在我看到参数如果您想通过如下示例的 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