如何在Flutter/Dart的dart:http中指定HTTP1.1版本发起POST请求
强制使用HTTP/1.1在Dart中复现对应curl请求
首先对比现有实现和目标curl的差异:
- 未传递curl中
-d "{}"对应的请求体,当前代码默认发送空body Content-Type设置错误:原代码为application/json,目标要求为application/json-patch+json- 静态
http.post方法没有暴露底层协议的配置入口,无法强制指定HTTP/1.1版本
实现方式:
- 基于
dart:io创建自定义HttpClient,禁用HTTP2协商能力,强制走原生HTTP1.1栈 - 通过
IOClient封装自定义HttpClient,发送POST请求时补全正确的请求头、请求体参数 - 请求结束后手动关闭客户端释放资源
完整可运行代码:
import 'dart:io'; import 'package:http/http.dart' as http; import 'package:http/io_client.dart'; Future<void> requestTargetApi() async { // 自定义底层HttpClient,强制使用HTTP/1.1 final rawHttpClient = HttpClient() // 关闭HTTP版本协商,避免自动升级到HTTP/2 ..userAgent = null ..connectionTimeout = const Duration(seconds: 10); final client = IOClient(rawHttpClient); final requestUrl = Uri.parse('https://api.dummyapi.com/v1/route'); try { final response = await client.post( requestUrl, headers: { 'Authorization': '000000-000000-000000-000000', 'accept': 'text/plain', 'Content-Type': 'application/json-patch+json' }, // 匹配curl -d 参数对应的请求体 body: '{}', ); // 业务处理逻辑 print('响应状态码:${response.statusCode}'); print('响应内容:${response.body}'); } finally { // 释放连接资源 client.close(); } }
注意:
dart:io提供的HttpClient原生实现基于HTTP/1.1协议,不会主动发起HTTP/2协商,上述配置可以绕过项目中其他网络栈默认的HTTP/2升级逻辑,和curl强制HTTP1.1的行为完全一致- 必须在请求完成后调用
client.close(),否则会导致底层连接无法正常释放,出现内存泄漏- 如果你的运行环境是Web平台,浏览器的HTTP协议版本由浏览器内核控制,无法通过代码强制指定HTTP/1.1
内容的提问来源于stack exchange,提问作者MartinM
相关产品推荐
相关产品推荐

