按照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。