Rust in Everything
基于 reqwest 0.13.5

常见坑

每一章对着一个报错或一个现象:先用最小的程序复现,再到源码里找它从哪一行来,最后给出修法和检查办法。前面几部分讲过的机制,这里只链过去。

复现环境都是 M2 Max、macOS 27、rustc 1.99.0、reqwest 0.13.5;请求都打到本机起的服务器上,涉及 0.12 的地方用 0.12.28 对照。

Client 的用法

  1. 每个请求新建 Client:连接不复用,每次都握手,build() 还要查一遍系统代理。
  2. 突发请求打到新主机,N 条连接 N 次握手:ALPN 还没协商出 HTTP/2 之前,每个请求各开一条连接。
  3. 只看状态码就丢掉响应,连接没法复用:HTTP/1.1 上丢掉大 body 或读了一半就关连接。
  4. 默认不带 User-Agent:要求 User-Agent 的服务器回 403。

超时

  1. 只设了 connect_timeout,请求还是卡住:三种超时默认都没有,连接超时管不到响应。
  2. read_timeout 把调用方的处理时间也算了进去:0.13.5 起,处理每块数据慢了也会超时。

代理与连接

  1. 本机请求被系统代理拦走:macOS 系统代理不看例外列表;NO_PROXY 按字面匹配主机名。

状态码与错误

  1. 4xx、5xx 也是 Ok:send() 不看状态码;error_for_status 会丢掉 body。
  2. error decoding response body:json() 失败时看不到 body,502 页面和字段类型变化报的是同一句。
  3. error sending request for url (...):{e} 只打一层,连接被拒、证书错误、超时看起来一样。
  4. builder error:非法头值到 send 才报,不说是哪个头。

TLS

  1. 依赖开了 native-tls,默认后端就换了:代码没动,TLS 后端换成 native-tls。
  2. danger_accept_invalid_certs 连冒名者也接受:证书和握手签名都不验;只放宽主机名要配 tls_certs_only。

重定向、重试、解压

  1. 重定向以后 Authorization 没了,x-api-key 还在:跨域只去掉五个固定的头,自定义密钥头照带。
  2. 自定义重试把 POST 发了三遍:分类器不看方法;重试用完返回 Ok(503);被重试的响应上的 Set-Cookie 会丢。
  3. GZIP 不解压,identity 挡不住解压:Content-Encoding 区分大小写;解压看客户端配置,不看请求头。
  4. GET 的流式 body 被静默丢掉:HTTP/1.1 上长度未知的 GET body 当成 0 字节。

阻塞客户端

  1. Cannot drop a runtime in a context where blocking is not allowed:只在 debug 构建 panic;release 静默阻塞,单线程运行时会死锁。
  2. 阻塞客户端的超时按段计,慢 body 永远读不完也不超时:默认 30 秒按阶段算,不是总时长。

版本

  1. 升级 0.13:does not have that feature:rustls-tls 改名、query / form 成了 feature、默认 TLS 换成 rustls。

💬 关联讨论

发起讨论
加载中...