常见坑
每一章对着一个报错或一个现象:先用最小的程序复现,再到源码里找它从哪一行来,最后给出修法和检查办法。前面几部分讲过的机制,这里只链过去。
复现环境都是 M2 Max、macOS 27、rustc 1.99.0、reqwest 0.13.5;请求都打到本机起的服务器上,涉及 0.12 的地方用 0.12.28 对照。
Client 的用法
- 每个请求新建 Client:连接不复用,每次都握手,
build()还要查一遍系统代理。 - 突发请求打到新主机,N 条连接 N 次握手:ALPN 还没协商出 HTTP/2 之前,每个请求各开一条连接。
- 只看状态码就丢掉响应,连接没法复用:HTTP/1.1 上丢掉大 body 或读了一半就关连接。
- 默认不带 User-Agent:要求 User-Agent 的服务器回 403。
超时
- 只设了 connect_timeout,请求还是卡住:三种超时默认都没有,连接超时管不到响应。
- read_timeout 把调用方的处理时间也算了进去:0.13.5 起,处理每块数据慢了也会超时。
代理与连接
- 本机请求被系统代理拦走:macOS 系统代理不看例外列表;
NO_PROXY按字面匹配主机名。
状态码与错误
- 4xx、5xx 也是 Ok:
send()不看状态码;error_for_status会丢掉 body。 - error decoding response body:
json()失败时看不到 body,502 页面和字段类型变化报的是同一句。 - error sending request for url (...):
{e}只打一层,连接被拒、证书错误、超时看起来一样。 - builder error:非法头值到
send才报,不说是哪个头。
TLS
- 依赖开了 native-tls,默认后端就换了:代码没动,TLS 后端换成 native-tls。
- danger_accept_invalid_certs 连冒名者也接受:证书和握手签名都不验;只放宽主机名要配
tls_certs_only。
重定向、重试、解压
- 重定向以后 Authorization 没了,x-api-key 还在:跨域只去掉五个固定的头,自定义密钥头照带。
- 自定义重试把 POST 发了三遍:分类器不看方法;重试用完返回
Ok(503);被重试的响应上的 Set-Cookie 会丢。 - GZIP 不解压,identity 挡不住解压:
Content-Encoding区分大小写;解压看客户端配置,不看请求头。 - GET 的流式 body 被静默丢掉:HTTP/1.1 上长度未知的 GET body 当成 0 字节。
阻塞客户端
- Cannot drop a runtime in a context where blocking is not allowed:只在 debug 构建 panic;release 静默阻塞,单线程运行时会死锁。
- 阻塞客户端的超时按段计,慢 body 永远读不完也不超时:默认 30 秒按阶段算,不是总时长。
版本
- 升级 0.13:does not have that feature:
rustls-tls改名、query/form成了 feature、默认 TLS 换成 rustls。
💬 关联讨论
发起讨论加载中...