使用Dart HttpClient发送Post请求后无法获取响应,该如何解决?
解决Dart HttpClient POST请求无法获取响应的问题
首先咱们先拆解你的代码里的两个核心问题,再一步步修正来拿到正确的响应:
1. 请求格式不匹配
你把请求头设为Content-Type: application/json,但实际发送的是param=编码后的json这种表单格式的内容,这会让服务器无法正确解析你的请求,自然也返回不了预期响应。JSONPlaceholder的/posts接口期望直接接收纯JSON格式的请求体,不需要包裹在表单参数里。
2. 未读取响应内容
你返回的HttpClientResponse只是响应的基础对象,还需要主动读取它的流内容才能拿到实际的响应数据。
修正后的完整代码
import 'dart:convert'; import 'dart:io'; Future<Map<String, dynamic>> submit() async { print('start'); Map<String, dynamic> data = { 'title' : 'My first post' }; String jsonString = json.encode(data); List<int> bodyBytes = utf8.encode(jsonString); HttpClient httpClient = HttpClient(); try { HttpClientRequest request = await httpClient.postUrl(Uri.parse('https://jsonplaceholder.typicode.com/posts')); // 保持请求头和发送内容格式一致 request.headers.set('Content-Type', 'application/json'); request.headers.set('Content-Length', bodyBytes.length.toString()); request.add(bodyBytes); HttpClientResponse response = await request.close(); print('响应状态码: ${response.statusCode}'); // 将响应流转换为字符串 String responseBody = await response.transform(utf8.decoder).join(); print('响应内容: $responseBody'); // 解析为JSON对象返回 return json.decode(responseBody); } catch (e) { print('请求过程出错: $e'); rethrow; } finally { // 务必关闭HttpClient,避免资源泄漏 httpClient.close(); } }
关键改动说明
- 对齐请求格式:直接发送JSON字符串的字节,不再用表单参数包裹,和
Content-Type声明的格式保持一致 - 读取响应流:通过
response.transform(utf8.decoder).join()把响应的字节流转换成可读的字符串,再解析为JSON对象 - 资源管理:用
try/finally确保HttpClient被关闭,防止长期运行导致的资源泄漏 - 错误捕获:添加异常捕获,方便快速排查请求过程中出现的问题
调用示例
你可以这样调用方法并获取最终结果:
void main() async { try { Map<String, dynamic> result = await submit(); print('最终返回结果: $result'); } catch (e) { print('调用出错: $e'); } }
这样就能正常获取到服务器返回的响应数据啦~
内容的提问来源于stack exchange,提问作者Patrick Obafemi
相关产品推荐
相关产品推荐

