go与http协议

 http请求流程

在浏览器地址栏键入URL,按下回车之后会经历以下流程:

1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4、Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。

5、若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

6、客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。 

 

 报文格式

请求报文

请求头可以设置,比如爬虫时需要伪装成浏览器可以设置User-Agent :

client := &http.Client{}
	req,_ := http.NewRequest("GET", url, nil)
	req.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50")
	resp,_ := client.Do(req)

还可以设置Connection为Close时为短连接请求,默认不设置或设置为Keep-Alive时为长连接请求

响应报文 

响应头也可以设置,比如Content-Type默认返回text/html,浏览器看到这个返回值会将返回的body文本渲染成html页面,如果改成下面的值,浏览器不进行渲染,直接展示原文本。

func handlefunc(w http.ResponseWriter, r *http.Request)  {
	w.Header().Set("Content-Type", "text/plain")
}

 

http请求方法

GET     请求指定的页面信息,并返回实体主体。
HEAD    类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
PUT     从客户端向服务器传送的数据取代指定的文档的内容。
DELETE  请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE   回显服务器收到的请求,主要用于测试或诊断。

 跨域资源共享(CORS)

跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器  让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求

设置返回报文 

跨域机制是一种浏览器的行为。当浏览器发起跨域请求时,默认情况下响应头里没有Access-Control-Allow-Origin这一项,此时服务器仍然会正常返回资源,但浏览器拦截返回并且报错,如果如下所示设置为“*”,允许跨域请求,则浏览器正常接收资源。这里的“*”代表来自所有域名的请求都允许跨域。可以指定允许某个域名,由于只允许设置一个值,所以可以通过r.Proto和r.Host获取协议ip地址和端口号,拼成完整的URL填入。只要不是访问相同域名,端口相同,协议相同,就是跨域 。

func handlefunc(w http.ResponseWriter, r *http.Request)  {
	w.Header().Set("Access-Control-Allow-Origin", "*")
}

如果请求方法不是get,head,post ,请求头中Content-Type的值不是text/plain、multipart/form-data、application/x-www-form-urlencoded或者请求头里设置了一些规定以外的值,即使设置了Access-Control-Allow-Origin,仍然不可以跨域,此时会增加一项额外的预检验请求,可以在返回头里面设置Access-Control-Allow-Headers,和Access-Control-Allow-Methods的值以允许跨域,如果设置了Access-Contro

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值