记踩HttpRequest设置header无效导致404问题

博客作者在使用Hutool进行网络请求时遇到404错误,经过排查发现,问题源于`HttpURLConnection`的限制,不允许自定义Host头部。官方文档与实际行为存在出入,导致请求失败。解决方案是找到允许设置限制头部的方法或寻找替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中有集成hutool的依赖,平时用惯了这个工具类,觉得还挺不错,所以想着某个需求也用这个。

可是,意外往往就是在意想不到的时候发生了。

这个需求发布到线上后发现,请求算法的接口报404错误。明明已经在 header 设置了参数 Host,可是算法的服务器依然很诚实的返回了404。

关键代码如下

580

大致的检查下,应该问题出在了 execute() 这个方法里。

来到了 初始化网络连接 的方法

581

设置请求头

582

通过断点来到 HttpURLConnectionsetRequestProperty() 方法

583

在这个方法里会判断 是否是限制的头部信息

584

585

由于 allowRestrictedHeaders 为false,并没有打开。(导致受限制的头部信息集合生效)

586

并且由于 受限制的集合() 里包含 Host

587

导致了自定义Host不成功,破案了!

可是 Hutool 的官方文档却这样说明

588

额…

### 如何在 HTTP 请求中设置 Header #### 使用 Go 语言设置 Header 在 Go 中,可以通过 `http.ResponseWriter` 和 `*http.Request` 对象来操作 HTTP 的响应头和请求头。以下是基于引用[1]的示例代码: ```go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { // 获取请求头中的 Accept 字段值 accept := r.Header.Get("Accept") fmt.Println("Request Accept:", accept) // 遍历并打印所有请求头字段 for key, values := range r.Header { fmt.Printf("%v: %v\n", key, values) } // 设置自定义响应头 w.Header().Set("Custom-Header", "Hello, World!") // 发送响应内容 fmt.Fprint(w, "Hello, World!") } func main() { http.HandleFunc("/", handler) fmt.Println("Starting server on :8080...") err := http.ListenAndServe(":8080", nil) if err != nil { panic(err) } } ``` 此代码展示了如何读取请求头以及如何设置响应头[^1]。 --- #### 使用 Python 设置 Header Python 可以借助 `requests` 库轻松实现向 HTTPS API 发起带 Header 参数的 GET 或 POST 请求。以下是一个完整的示例代码: ```python import requests # 定义请求 URL url = 'https://api.example.com' # 设置 header 参数 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', 'Authorization': 'Bearer your_token' } # 发送 GET 请求,并携带 header 参数 response = requests.get(url, headers=headers) # 输出响应内容 print(response.text) ``` 这段代码演示了如何通过 `requests` 库设置 Header 并发起网络请求[^2]。 --- #### 使用 cURL 设置 Header cURL 是一种强大的命令行工具,可以用来测试 HTTP 请求。如果需要为 GET 请求添加 Header,可以使用 `-H` 参数指定额外的 Header 字段。例如: ```bash curl -X GET https://api.example.com \ -H "User-Agent: Mozilla/5.0" \ -H "Authorization: Bearer your_token" ``` 以上命令会向目标服务器发送带有两个自定义 Header 的 GET 请求。此外,还可以通过 PHP 脚本调用 cURL 来完成更复杂的场景需求[^3]。 --- ### 总结 无论是在 Go、Python 还是其他编程环境中,都可以方便地设置 HTTP 请求的 Header。具体方法取决于所使用的库或工具的功能支持情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值