添加多个自定义 http 请求标头之谜

Posted

技术标签:

【中文标题】添加多个自定义 http 请求标头之谜【英文标题】:Adding multiple custom http request headers mystery 【发布时间】:2012-03-14 23:44:46 【问题描述】:
HttpGet request = new HttpGet("https://192.168.1.140:8732/...);

我想知道为什么如果我执行以下操作,我只能成功发送自定义标头:UserName 和 AuthToken:

    request.setHeader("User-Agent", "android_client");
    request.setHeader("Host", "192.168.1.140:8732");
    request.addHeader("UserName", mUserName);
    request.addHeader("AuthToken", mAuthorizationToken);

为什么这段代码不发送 UserName 而只发送 AuthToken?当两条底线颠倒时。

    request.setHeader("User-Agent", "android_client");
    request.setHeader("Host", "192.168.1.140:8732");
    request.addHeader("AuthToken", mAuthorizationToken);
    request.addHeader("UserName", mUserName);

为什么这段代码失败并显示 400 错误代码,当我没有指定主机时主机名无效

//  request.setHeader("User-Agent", "android_client");
//  request.setHeader("Host", "192.168.1.140:8732");
    request.addHeader("UserName", mUserName);
    request.addHeader("AuthToken", mAuthorizationToken);

如果我不需要发送 UserName 和 AuthToken,我真的不需要设置主机,它可以很好地使用注释掉的代码,如下所示

//  request.setHeader("User-Agent", "android_client");
//  request.setHeader("Host", "192.168.1.140:8732");

虽然我不认为它是相关的,但我想透露我正在使用自签名证书来执行来自 android 的这些 http 调用,遵循这个 blog。期待我可怜的http灵魂的神圣启示......

【问题讨论】:

您如何知道实际发送的是什么?您是否使用 Fiddler 检查过数据流?它会通过一些配置代理 HTTPS。 我还在 WCF C# 中编写服务器端代码。所以我知道正在发送什么。使用 fiddler 添加了两个自定义标题。只有那些 android 客户端代码有问题。 @Win Myo Htet:您可以通过在客户端激活线路/上下文日志记录来查看发送的 HTTP 数据包访问线路。您将看到请求消息中是否包含所有请求标头。 【参考方案1】:

这是侥幸。我再也无法重现它了。我一直在使用工作解决方案,并在不同的项目上工作了一段时间。在How to enable logging for apache commons HttpClient on Android 的帮助下,我回来查看oleg 建议的wire /context logging,我无法再重现该问题。伐木的力量已经把问题吓跑了。如果问题再次出现并且如果我找出原因会更新。

【讨论】:

以上是关于添加多个自定义 http 请求标头之谜的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义 HTTP 请求标头添加到 Thymeleaf 生成的表单或链接?

为BlazeDS和AMF发送的请求添加自定义HTTP标头

TypeScript 在 Express 中添加自定义请求标头

向 IMG、VIDEO 和 AUDIO 请求添加自定义标头

与 qtwebkit 请求一起发送自定义标头

Firefox 和 Safari 不在 Service Worker 请求中发送自定义 http 标头