专栏首页信数据得永生web开发快餐式入门指南 1.1 http

web开发快餐式入门指南 1.1 http

由于web应用大多数都在浏览器中进行操作,所以我们有必要先了解一下浏览器里面到底发生了什么。简而言之,当你在浏览器的地址栏中输入网址并按下回车,或者点击了网页上的某个链接时,浏览器就会按照网址给目标服务器发送请求。浏览器和服务器之间的请求遵循http协议,协议规定了所使用的格式,只有按照这种格式组织的数据才能相互识别。

具体来讲,浏览器先根据url中的主机部分通过dns查询出ip地址,然后组装http报文,发送给这个ip。服务器接到请求后便会处理,然后也会组装一个报文,把结果放入其中发给浏览器。浏览器根据html或js中写好的逻辑,以刷新页面或者弹出消息框等方式和用户交互。这一来一回才算结束。

格式

我们可以用浏览器的开发者工具,或者其它抓包软件进行抓包,从而看到背后的http请求是什么。比如访问www.baidu.com,则有可能会看到这样的报文:

GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: ...

HTTP/1.1 200 OK
Server: bfe/1.0.8.14
Date: Tue, 23 Feb 2016 12:43:08 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: private
Expires: Tue, 23 Feb 2016 12:43:08 GMT
Content-Encoding: gzip
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 2
BDQID: 0xd678b56500003dd4
BDUSERID: 18401
Set-Cookie: ...

...

可以看到,上半部分是请求(request)的报文,下半部分是响应(response)的报文。请求和响应的报文都由三部分组成:状态行、消息头(header)和消息体(body)。其中状态行在请求或者响应中,分别叫做请求行和响应行,消息头在请求或者响应中也分别叫做请求头和响应头,消息体也叫正文,是可选的。

请求报文

我们先看请求报文,第一行GET / HTTP/1.1就是请求行,其中GET是方法,/是路径,HTTP/1.1是所使用的HTTP版本。

之后几行以:分割的文本是请求头,请求头的种类很多,其中还有不少自定义的请求头,但是上面列出的都是常见的请求头,我们只需要了解它们。

Host是所请求的域名,由于现在大量虚拟主机和云主机的存在,一个ip的主机上往往有很多个网站,所以要加上Host请求头,不能简单以ip来定位。

Accept是浏览器接受的格式,我们可以看到有html、xhtml和xml。

User-Agent是浏览器的类型,也包含浏览器内核类型和操作系统类型。由于用户可以任意改动请求头,它不一定是可信的。

Accept-Encoding是浏览器接受的编码,我们可以看出浏览器启用了gzip压缩。

Accept-Language是浏览器接受的语言。

Cookie是用户标识用户的数据,由服务端程序生成,储存在浏览器中,每次浏览器访问一个网站,都要带上已有的Cookie。

上面的报文中,由于是GET方法,没有消息体。

消息体如果存在,和消息头以两个换行\n\n分隔。如果有消息体的话,请求头中还要加上两种。一个是Content-Length,是消息体的长度。还有一个是Content-Type,是消息体的格式,这个参数很重要,因为大多数框架都自动解析消息体,如果错了的话就会解析失败。

响应报文

同理,响应报文的第一行HTTP/1.1 200 OK是响应行,HTTP/1.1是版本,200是状态码,OK是状态文本。响应头和请求头的格式一样,但内容有所不同。而且,服务器设置Cookie所用的响应头是Set-Cookie而不是Cookie

上面的响应报文是带消息体的,同样和响应头以\n\n分隔。

方法

接下来要讲一下HTTP的方法。

HTTP的方法有很多种,但是如果你打开抓包软件记录你一天的浏览历史的话,你会发现99%都是GET或者POST,其中GET占大多数。一般情况下,我们只会用到这两种方法,GET常用于资源的获取,比如页面显示,POST则用于动作的提交,比如删除、新增、修改某种资源。

GET和POST都可以带参数,只不过参数在报文中的位置不同。GET方法中的参数出现在路径中,以?分割,比如/path/to/page?k1=v1&k2=v2。而且你也发现了,这种位置上只能写成键值对形式。HTTP协议中并没有对参数的长度进行限制,但由于GET参数是写在url中的,在浏览器以及服务器中会有限制,比如Chome中限制url长度不超过8182字节。

POST的参数在消息体中,长度任意。而且格式任意,比如可以使用json和xml,只要把Content-Type配置对了,让服务器能够正常识别就好。服务器可以限制消息体的长度,但也可以通过配置来取消。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 重磅 | 完备的 AI 学习路线,最详细的资源整理!

    版权声明:License CC BY-NC-SA 4.0 / 自豪地采用谷歌翻译 https://blog.csdn.net/wizardforcel/...

    ApacheCN_飞龙
  • JavaScript 编程精解 中文第三版 八、Bug 和错误

    ApacheCN_飞龙
  • 某道Pwn(格式化字符串漏洞)

    我们可以看到p在flag下面四个偏移,a又在p下面四个偏移,用缓冲区溢出是不可能了。下面有个printf,也许可以利用字符串格式化漏洞。

    ApacheCN_飞龙
  • GO-HTTP 协议

    因为编写 Web 应用必须对 HTTP 有所了解,所以接下来我们对 HTTP 进行介绍。

    cwl_java
  • 【读书笔记】1.2、基于HTTP协议的RPC

    1.2.1HTTP协议栈 HTTP协议 Hypertext Transfer Protocol的缩写(超文本传输协议) 属于应用层协议,构建在TCP与IP协议之...

    java思维导图
  • cssjshtml GET 和 POST 报文上的区别

    最近看了一些同学的面经,发现无论什么技术岗位,还是会问到 get 和 post 的区别,而搜索出来的答案并不能让我们装得一手好逼,那就让我们从 HTTP 报文的...

    葫芦
  • 都2019年了,还问GET和POST的区别【深度好文】

    最近看了一些同学的面经,发现无论什么技术岗位,还是会问到 get 和 post 的区别,而搜索出来的答案并不能让我们装得一手好逼,那就让我们从 HTTP 报文的...

    用户2149234
  • 【web必知必会】—— 图解HTTP(下)

    上一篇《图解HTTP 上》总结了HTTP的报文格式,发送方式,以及HTTP的一些使用。 本文再总结以下内容:   1 http状态码   2 http报...

    用户1154259
  • 本次更新包括集成CDSW1.3

    目前互联网大量web的应用层协议从http迁移到了https,https已经在越来越多的场合替换http协议。近期由于业务需要,我们通过Wireshark对ht...

    用户3138296
  • 再论桥接模式(上)纸上谈兵

    声明: 1、 这里不是讲解桥接模式,因为我觉得我没有那个实力,我现在还没有完全理解桥接模式。 2、 这里只是想把我这几天的思考、在群里的讨论整理一下,给自己...

    用户1174620

扫码关注云+社区

领取腾讯云代金券