You need to enable JavaScript to run this app. 如何在Flutter/Dart的dart:http中指定HTTP1.1版本发起POST请求
优惠活动
大模型
产品
解决方案
定价
更多

如何在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版本

实现方式:

  1. 基于dart:io创建自定义HttpClient,禁用HTTP2协商能力,强制走原生HTTP1.1栈
  2. 通过IOClient封装自定义HttpClient,发送POST请求时补全正确的请求头、请求体参数
  3. 请求结束后手动关闭客户端释放资源

完整可运行代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.29 00:45:06