2.3 HTTP接口
下面介绍最常用的HTTP接口。
(1)HTTP接口的应用场景:Web网站、公司的OA服务、小型手机游戏等。
(2)HTTP请求由三部分组成,分别是:请求地址、消息报头、请求正文。
(3)HTTP响应也是由三个部分组成,分别是:状态码、消息报头、响应正文。
下面用具体的实例来说明HTTP接口。
这里使用的是Fiddler工具。该工具可以抓取HTTP数据包,辅助进行测试。通过该工具抓取特定网页的协议数据包,来分析HTTP的知识点。该工具的具体使用方法会在第3章详细讲到,目前读者只需要知道该工具可以抓取HTTP数据包即可。
下面抓取的是百度个人中心首页的“百度新闻”→“个性推荐”栏目中的短数据,页面如图2-3-1所示。
图2-3-1 百度个人中心
使用Fiddler工具获取的接口数据如图2-3-2所示。
图2-3-2 使用Fiddler工具获取的接口数据
1.HTTP请求的三个重要数据
(1)请求地址:http://i.baidu.com/card。
(2)消息报头:
名词解释
下面介绍消息报头的主要参数。
· Host:i.baidu.com
指定被请求资源的Internet主机和端口号,默认是80端口。
· Connection:keep-alive
HTTP长连接(持久连接),客户端和服务器端建立一次连接之后,可以在这条连接上进行多次请求/响应操作。持久连接,可以设置过期时间(Keep-Alive:timeout=60),也可以不设置。
· Accept:*/*
表示浏览器能接受任何类型的文件。
· X-Requested-With:XMLHttpRequest
表明这是一次Ajax请求(异步),非传统请求(同步)。
· User-Agent:Mozilla/5.0(Windows NT 6.1;WOW64)
用户代理。告知服务器请求方所使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
· Accept-Encoding:gzip,deflate
设置从网站中接收的返回数据是否进行gzip压缩。
· Cookie:BDUSS=d0b2JQSGxBbXQ3NUhIcWpqT21xd
储存在本地的缓存数据,随HTTP请求一起发送,用来给服务器端验证,比如是否已经登录。
(3)请求正文:p=xinwen&c=pernews。
2.HTTP响应的三个重要数据
(1)状态码:
(2)消息报头:
(3)响应正文:
下面介绍响应的消息报头。
“Content-Type:application/JSON;charset=UTF-8”表示服务器发送的实体数据的数据类型。
在HTTP请求的返回数据包中,响应状态码分为以下5种。
· 1xx:消息。一般是告诉客户端,请求已经收到了,正在处理,别急……
· 2xx:处理成功。一般表示请求收悉、我明白你要的、请求已受理、已经处理完成等信息。
· 3xx:重定向到其他地方。它让客户端再发起一个请求,以完成整个处理过程。
· 4xx:处理发生错误,错误来自客户端。例如,客户端请求的是一个不存在的资源、客户端未被授权、禁止访问等。
· 5xx:处理发生错误,错误来自服务器端。例如,服务器端抛出异常、路由出错、HTTP版本不支持等。
2.3.1 HTTP发送请求的方式
HTTP中有四种发送请求的方式:GET、POST、PUT和DELETE。
(1)GET:向特定的资源发出请求。
(2)POST:向指定资源提交“数据进行处理”请求(例如,提交表单或者上传文件),数据被包含在请求体中。POST请求可能导致新的资源的创建,以及(也可能是“或”)已有资源的修改。
(3)PUT:向指定资源位置上传其最新内容。
(4)DELETE:请求服务器执行删除操作。
在实际应用中常用的是GET和POST。其他的请求方式都可以通过这两种方式间接地实现。
2.3.2 GET方式和POST方式的区别
HTTP发送请求最主要的两个方式是GET和POST,这两者有哪些区别呢?
区别一:对请求参数的处理方式不同(直观的区别)
(1)GET请求:请求的数据会附加在URL之后,以“?”分隔URL和传输数据,如有多个参数则用“&”连接。URL采用的是ASCII编码格式,而不是Unicode编码格式,即所有的非ASCII字符都要在编码之后再传输。
举例:https://www.v2ex.com/api/nodes/show.JSON?name=Python
(2)POST请求:POST请求会把请求的数据放置在HTTP请求包的Body数据中,数据包的形式可以是“参数名1=参数值1&参数名2=参数值2”,也可以是JSON格式(键值对)。当然,JSON格式是一种通用的方式。
举例:http://192.168.1.171:8081/api/user_sign/
Body数据:{"time":"1499933825","sign":"deb697c7fffcca828a7a03a218b2cda5"}
区别二:传输数据的大小不同
HTTP没有对传输数据的大小进行限制,也没有对URL的长度进行限制。而在实际的程序开发中,存在以下限制。
· GET:特定浏览器和服务器对URL的长度有限制。例如,IE对URL长度的限制是2083Byte(2×1024Byte+35Byte)。其他浏览器(如Netscape、FireFox等)在理论上没有长度的限制,其限制取决于操作系统的支持。因此,在采用GET方式提交数据时,传输数据会受到URL长度的限制。
· POST:由于不是通过URL传值,在理论上数据的大小不受限制。但实际上,各个Web服务器会对采用POST方式提交的数据的大小进行限制,例如,Apache、IIS6都有各自的配置。
区别三:安全性不同
POST方式的安全性比GET方式的安全性高。使用GET方式时,在地址栏里可以直接看到请求数据,采用这种方式可能受到Cross-site request forgery攻击。
POST方式需要抓包才能获取到数据,变相地提高了安全性。