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
相关产品推荐
相关产品推荐

