You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何从HTTP GET请求移除Content-Length请求头?

解决Flutter中GET请求自动携带content-length:0导致400错误的问题

我之前也碰到过一模一样的情况,有些服务器对HTTP规范的校验特别严格,看到GET请求带content-length头就直接返回400。下面分别给你说下http包和dio包的可行解决办法:

一、使用http包的解决方案

默认的http.get()方法会自动注入一些默认头,哪怕没有请求体,也会带上content-length:0。要避开这个问题,你可以手动构建Request对象来发送请求,这样就能避免自动生成这个多余的头:

import 'package:http/http.dart' as http;

final client = http.Client();
// 手动创建GET请求,不设置任何请求体
final request = http.Request('GET', url);
// 发送请求并获取响应流
final streamedResponse = await client.send(request);
// 可选:把响应流转成常用的Response对象
final response = await http.Response.fromStream(streamedResponse);

用这种方式发送的GET请求,就不会携带content-length:0头了。

二、使用dio包的解决方案

你之前直接移除Headers.contentLengthHeader没生效,是因为dio内部会根据请求是否存在体自动补全这个头。最稳妥的办法是添加一个请求拦截器,在请求真正发送前强制删除这个头:

import 'package:dio/dio.dart';

final dio = Dio();
// 添加请求拦截器,在发送前清理多余头
dio.interceptors.add(InterceptorsWrapper(
  onRequest: (options, handler) {
    // 强制移除content-length头
    options.headers.remove(Headers.contentLengthHeader);
    return handler.next(options);
  },
));

// 正常发送GET请求即可
final response = await dio.get(url);

另外还有一种更简洁的方式:创建BaseOptions时直接把contentType设为null,这也能阻止dio自动生成content-length头:

final options = BaseOptions(
  contentType: null,
);
final dio = Dio(options);
final response = await dio.get(url);

为什么会出现这个问题?

按照HTTP规范,GET请求是不需要请求体的,所以content-length头对GET请求来说完全是多余的。部分严格遵循规范的服务器会直接拒绝携带这个头的GET请求,返回400错误;而Postman这类工具默认发送GET请求时不会添加这个头,所以能正常返回200。

内容的提问来源于stack exchange,提问作者hyge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:50