HTTP 简介
HTTP协议
HTTP(Hyper Text Transformer Protocol,超文本传输协议)是一种由客户端发起请求,通过 URL(Uniform Resource Locator,统一资源定位符)来访问服务器资源的一种通信协议。该协议基于 C/S 模型,以文本的形式组织请求和响应的报文。通信模型如下:
HTTP 协议的主要应用场景有:基于浏览器的网页获取与表单提交、文件上传与下载、移动应用、物联网设备的数据上报等。
请求和响应报文
请求报文
HTTP 请求报文的格式如下:
Request line
:请求行,由method
、URL
、Version
字段组成。method
:请求方法,常用的方法有 GET、POST、PUT、HEAD、DELETE 等,详见下文。URL
:统一资源定位符,用于标识服务器资源的路径。Version
:协议版本,目前常用的版本为HTTP/1.1
。
Header lines
:请求首部,由一个或多个头域组成,每个头域的格式为header field name: value
。head field name
:头域的名称。value
:头域的值。
Entity body
:消息体,即向服务器传递的消息正文。
值得注意的是,图中的
sp
表示空格,cr
lf
表示回车与换行,请求首部与消息体之间必须插入一行空行,即图示的Blank line
。
请求报文的示例如下:
响应报文
HTTP 响应报文的格式如下:
Status line
:响应状态行,由version
、status code
、phrase
字段组成。version
:协议版本,目前常用的版本为HTTP/1.1
。status code
:响应状态码,详见下文。phrase
:原因短语。
Header lines
:响应首部,由一个或多个头域组成,每个头域的格式为header field name: value
。head field name
:头域的名称。value
:头域的值。
Entity body
:消息体,即服务器响应的消息正文。
值得注意的是,图中的
sp
表示空格,cr
lf
表示回车与换行,响应首部与消息体之间必须插入一行空行,即图示的Blank line
。
响应报文的示例如下:
HTTP 请求方法
HTTP 常用的方法有 GET、POST、PUT、HEAD、DELETE 等。
-
GET:HTTP 请求中最常用的方法,用于向服务器请求获取资源。
-
HEAD:和 GET 方法一样,但是不返回报文实体主体部分。主要用于确认 URL 的有效性以及资源更新的日期时间等。
-
PUT:用于向服务器上传资源,当资源不存在时则创建资源,否则会替换资源。
-
POST:用于修改服务器资源,当资源不存在时则创建资源,否则会修改资源。
-
DELETE:删除资源,与 PUT 功能相反。
HTTP 状态码
服务器返回的响应报文中第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。
状态码 | 类别 | 原因短语 |
---|---|---|
1xx | Informational(信息性状态码) | 接收的请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
HTTP 协议的具体内容请参考国际互联网工程任务组的官方文档。
HTTP 协议与 TCP 协议的区别与联系:
HTTP 协议是基于 TCP 协议实现的。
TCP 协议面向字节流,用户无法很好地确定业务数据的边界;而 HTTP 协议具有特定的报文格式,而且用户业务数据可通过
Content-Length: ${Length}
头域来指定用户数据长度,或通过Transfer-Encoding:chunked
头域来指定用户数据编码格式,两种方式均可确定业务数据的边界。QuecPython 模组已同时支持对Content-Length: ${Length}
和Transfer-Encoding:chunked
两种方式的解析。
HTTP 应用范例
天气查询
高德开放天气查询接口:http://restapi.amap.com/v3/weather/weatherInfo?key=2875b8171f67f3be3140c6779f12dcba&city=北京&extensions=base
北京
可替换为其他国内城市名称。
import request
# Weather query URL
url = 'http://restapi.amap.com/v3/weather/weatherInfo?key=2875b8171f67f3be3140c6779f12dcba&city=北京&extensions=base'
# Send the HTTP GET request
response = request.get(url)
# Get raw data from the website and parse it into a dict type by calling the json() method of response object
data = response.json()
data = data['lives'][0]
for k,v in data.items():
print('%s: %s' % (k, v))