Flutter中Dart http包默认请求头及Client类差异问询
Dart http包默认请求头与Client类差异
一、默认请求头说明
GET 请求
使用http.get()等顶层函数发送GET请求时,默认携带以下请求头:
Host: 自动从请求URL中提取(例如请求https://example.com/api时,Host为example.com)Accept-Encoding:gzipConnection:close(顶层函数每次请求会创建临时连接,请求完成后立即关闭)User-Agent:Dart/<版本号> (dart:io)(例如Dart/3.1.0 (dart:io))
POST 请求
使用http.post()顶层函数发送POST请求时,除上述GET请求的默认头外,还会额外添加:
Content-Type:text/plain; charset=utf-8(未手动指定Content-Type且body为字符串时)Content-Length: 自动根据请求body长度计算并添加
若POST请求的body为FormData(需配合http.MultipartRequest),默认Content-Type会变为multipart/form-data并包含boundary参数,同时自动处理相关Content-Length等头。
二、使用Client类的差异
连接持久化:
Client类维护持久化连接,默认Connection头为keep-alive,而非顶层函数的close。多次通过同一个Client发送请求时,会复用TCP连接,提升请求效率。自定义默认请求头:
可为Client实例设置defaultHeaders,后续所有通过该Client发送的请求都会自动携带这些头。示例:
final client = http.Client(); client.defaultHeaders['Authorization'] = 'Bearer token123'; // 后续client.get()或client.post()都会带上Authorization头
顶层函数每次请求独立,不会保留之前设置的头。
- 资源管理:
使用Client时需手动调用client.close()释放连接资源,否则会造成泄漏;顶层函数会自动管理临时连接生命周期,请求完成后自动关闭。
内容的提问来源于stack exchange,提问作者Stewie Griffin
相关产品推荐
相关产品推荐

