关于http请求头host字段中的port

按照RFC的描述:https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.23
http请求头host字段用来指定host和port。
如果该字段中没有指定port,表示使用默认端口。比如,http的则使用默认端口80,https的则使用默认端口443。

按照这个描述,对于默认端口,host中是否指定似乎都是可以的。
实际使用经验:
1、如果host字段中指定默认端口,部分服务器会无法处理,从而导致域名解析失败或者连接失败的错误。
比如facebook的一些下载链接就不支持指定默认端口的请求。
2、如果host字段中不指定默认端口,可能也会出问题。这种情况我没有遇到过,但网上有人遇到过不指定默认端口遇到了连接问题。

可见,是否支持host中指定默认端口,依赖于服务器对协议的实现。
那么client端该采取什么策略?

android网络库的做法是默认端口不指定,非默认端口指定。
参考源码:
https://android.googlesource.com/platform/frameworks/base.git/+/f013e1afd1e68af5e3b868c26a653bbfb39538f8/core/java/android/net/http/Request.java
其中getHostPort方法的实现

个人建议:
对于使用默认端口的请求,host字段中不指定port;
如果不指定port的请求出现域名解析或连接相关的失败,则进行重试,重试时host字段中加上port。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值