golang中设置Host Header的小Tips
前言##
笔者最近时间一直在学习和写Ruby和Go,尤其是Go,作为云计算时代的标准语言,写起来还是相当有感觉的,难过其会越来越火。
不过写的过程中,也遇到了一些小问题,本文就是分享关于go语言设置 HTTP请求当中 Host Header的一个小注意事项。
常规做法##
通常我们在设置HTTP的Header请求时,一般都是这么做:
Header.Add("Authentization", "TOKEN")
Header.Add("Content-Type", "application/json")
...
Java, Ruby, Go 都是如此,区别的只是语法不同。但是对于Host Header的处理就不同了。在Go中,如果我们这么写:
header.Add("Host", "XXXXXXXXX")
那么问题就出来了 —— 也许从请求发送的log中,你看不到任何的错误,但是如果查看服务端的log,你会发现,服务端接受到Host Header并不是你想发送的,而仍然是URL中的Host。
这是为什么呢?
为什么Go中Host Header不能这么加?##
原来Go的设计上是用一个单独的HOST属性来定义此Request属性,参考net/http包中Request.go文件定义的Request结构体:
// For server requests Host specifies the host on which the
// URL is sought. Per RFC 2616, this is either the value of
// the "Host" header or the host name given in the URL itself.
// It may be of the form "host:port".
//
// For client requests Host optionally overrides the Host
// header to send. If empty, the Request.Write method uses
// the value of URL.Host.
Host string
那么在使用上,如果我们想传一个特定的Host,应该这么做:
Req.Host="XXXX"
但是,为啥Go就如此特殊呢?
Go为啥如此特殊?##
原来从HTTP Spec角度,是不大希望让Host Header可以修改,这里的HOST应该是从URL得到,而不是任意的指定。
但是考虑到很多场景,尤其是Client Requests,很多时候我们希望能够修改这个HOST参数,来模拟我们的需求,如果Go能响应修改其源码就好了?
搜一下,发现这个问题也确实有人提过,如下:
[net/http: Setting custom "Host" request header doesn't have effect #7682](net/http: Setting custom "Host" request header doesn't have effect #7682)
而结论是:
I don't think we can safely change the behavior at this point.
最好也只是更新了文档,去掉了关于HOST参数的歧义。
对Go实现的第三方工具的影响##
既然go语言没有更改这个需求,为了适应大家的习惯,如果有必要,我们可以这样做一个Workaround:
if host := header.Get("Host"); host != "" {
req.Host = host
}
而且这也是很多用Go写的工具的通用做法,比如:
Contact me ?
Email: jinsdu@outlook.com
Blog: http://www.cnblogs.com/jinsdu/
Github: https://github.com/CarlJi
童鞋,如果觉得本文还算用心,还算有用,何不点个赞呢(⊙o⊙)?
golang中设置Host Header的小Tips的更多相关文章
- Golang中设置函数默认参数的优雅实现
在Golang中,我们经常碰到要设置一个函数的默认值,或者说我定义了参数值,但是又不想传递值,这个在python或php一类的语言中很好实现,但Golang中好像这种方法又不行.今天在看Grpc源码时 ...
- lumen中间件中设置响应header
<?php namespace App\Http\Middleware; use Closure; class BeforeMiddleware { public function handle ...
- 原创:C sharp 中 Enum的几点小 Tips
(1)为什么要使用Enum? ♥ enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储.enum student{a,b,c,d,e},其中enum代表student为 ...
- 关于Calendar中设置月份比实际小1的问题
有如下程序,转化两个字符串数字为date类型,并判断是历史上的星期几,是否同为星期一 代码如下: public static void main(String[] args) throws Parse ...
- [转]Golang 中使用 JSON 的小技巧
taowen是json-iterator的作者. 序列化和反序列化需要处理JSON和struct的关系,其中会用到一些技巧. 原文 Golang 中使用 JSON 的小技巧是他的经验之谈,介绍了一些s ...
- 转 jquery怎么在header中设置请求信息
jquery是js的类库,js本身不能操作header,因为js是在浏览器加载页面过程中才开始执行的 header需要服务器端执行操作 如果是ajax,是可以设置header $.ajax({ url ...
- vue2.5.2版本 :MAC设置应用在127.0.0.1:80端口访问; 并将127.0.0.1指向www.yours.com ;问题“ Invalid Host header”
0.设置自己的host文件,将127.0.0.1指向自己想要访问的域名 127.0.0.1 www.yours.com 1.MAC设置应用在127.0.0.1:80端口访问: config/index ...
- Confluence 6 外部小工具在其他应用中设置可信关系
为了在你的 Confluence 中与其他应用建立外部小工具,我们建议你在 2 个应用之间设置 OAuth 或者信任的应用连接关系.在这个例子中,外部应用为小工具的服务器(服务器提供者)和 Confl ...
- Emacs中Golang的设置
欲善其事,先利其器.下面记录一些使用Emacs24做golang开发中的一些有用设置,备忘用. 一,golang中的代码跳转 emacs24的go-mode中默认用godef-describe,god ...
随机推荐
- GestureDetector封装手势检測上下滑动
项目中须要检測ListView的上滑下滑隐藏顶部View控件,之前在网上也有非常多实现案例.在git上发现个封装非常不错的样例,记录下来. GestureDetector是一个手势检測类,内部有个Si ...
- Android.mk各种文件编译汇总
一.源代码编译 1.1 so预编译 LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libAppArea LOCAL ...
- keepalive support-----Programming applications
TCP Keepalive HOWTO Prev Next 4. Programming applications This section deals with programming code ...
- [Labview资料] labview事件结构学习
编程的主要目的是为了实现用户的某种功能,用户通过用鼠标.键盘.程序内部等触发某种程序动作,从而达到某种结果,这些操作都被称作为事件,LabVIEW中相应这些事件最常用的结构就是“事件结构”.事件结 ...
- h5宣传页制作过程中遇到的问题
音乐播放 ios下关闭不流畅; (ios下需重新image 模拟) 音乐设置自动播放属性后 部分机型下不能自动播放.目前解决方案: touchstart时触发播放 微信“分享给朋友”点击发送后,页面卡 ...
- "ORA-00942: 表或视图不存在 "的原因和解决方法
"ORA-00942: 表或视图不存在 "的原因和解决方法 采用Oracle数据库,使用Powerdesigner设计,生成Sql文件导入后查询出现“ORA-00942: 表或 ...
- CSS背景颜色、背景图片、平铺、定位、固定
CSS背景颜色设置 background-color:red;如设置背景颜色为红色: 背景颜色设置支持3种写法: 颜色名 16进制 rgb CSS背景图片颜色设置 background-image:u ...
- CentOS7上GitLab的使用
生成SSH Keys 生成root账号的ssh key # ssh-keygen -t rsa -C "admin@example.com" 显示pub key的值 # cat ~ ...
- 逻辑回归应用之Kaggle泰坦尼克之灾(转)
正文:14pt 代码:15px 1 初探数据 先看看我们的数据,长什么样吧.在Data下我们train.csv和test.csv两个文件,分别存着官方给的训练和测试数据. import pandas ...
- DEDE自带的采集功能,标题太短的解决方法
DEDE自带的采集功能,标题太短获取不全的解决方法搜索了好多之后,终于还是在dede的官方论坛找到了答案.增加采集标题长度:255 目的:原标题长度太小,影响文件采集⑴修改系统参数设置(文档标题最大 ...