700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用 python requests 模块发送 http 请求及接收响应

使用 python requests 模块发送 http 请求及接收响应

时间:2019-04-04 01:46:26

相关推荐

使用 python requests 模块发送 http 请求及接收响应

内容概要

如何构建GET 与 POST request 请求消息对 request 的header , query string, message body 定制化http header参数 content-type 的设置分析request, response 消息数据通过POST请求上传文件请求与响应使用 json 格式

为什么推荐使用 requests 模块?

用 python 编写 http request 消息代码时,建议用requests库。因为requests比urllib内置库更为简捷,requests可以直接构造get,post请求并发送,而urllib.request只能先构造get,post请求消息内容,然后再发送。并且requests 模块提供了更友好的方法与属性来解析response消息内容。

1. 准备知识

1.1 HTTP request 与 Response 通讯机制

http协议是基于1种客户机(client) – 服务器(server) 的通信模式,它的下层是TCP协议。

所有的请求request 都是由客户机发起的服务器对客户请求做出响应response每个request 都是独立于其它request消息,服务器不需要跟踪request消息的状态

1.2 Http Request 请求消息

客户端发送一个HTTP请求到服务器的请求消息由四个部分组成

请求行(request line)请求头部(header)、空行(CLF)请求数据(payload,或body)

下图给出了请求报文的一般格式。

上图中,可以看到。Request 请求行第1个字节为请求方法, 有时也称动词(verb), 常用的主要有4种方法:GET, POST, PUT, DELETE

1.3 Http Response 响应消息

服务器的响应消息, 也是由4部分组成

状态行、消息报头、空行和响应正文

2. 安装 requests 模块

安装requests 模块非常简单,

pip install requests

3. GET 请求

3.1 request.get() 方法

用于准备并发送 http get 请求至指定url , 并返回response 对象

requests.get(url, params=None, **kwargs)

url: 拟获取页面的url链接params: url中的额外参数,字典或字节流格式,可选**kwargs: 可选参数,共有12个控制访问的参数

url格式:http://host_ip:port/path/add?key1=value1&key2=value2

传参数用字典类型:params={ key1: value1, key2: value2 }

response = requests.get('/search/repositories',params={'q':'requests+language:python'},)

可能遇到的问题:

如果参数中包含汉字 ,则会报编码错误,

可先进行编码, (将utf-8转为ascii码 )

urllib.parse.urlencode(dic)

解码:

urllib.parse.unquote(dic or str)

# 例1 keyword = input('请输入搜索关键字:')param_list = urllib.parse.urlencode( {'wd' : keyword } ) header = {'user-Agent':’haha‘}url = '/s/'response = request.get( url, params=param_list, headers = header )# 例2headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36"}request.get("",headers=headers)

cookies = {"name":"haha"}request.get("",cookie=cookies)

3.2 Response 对象常用属性及方法

收到response后,需要分析 status_code,有必要可以对404, 500等出错响应进行特殊处理。

import requestsfrom requests.exceptions import HTTPErrorfor url in ['', '/invalid']:try:response = requests.get(url)# If the response was successful, no Exception will be raisedresponse.raise_for_status()except HTTPError as http_err:print(f'HTTP error occurred: {http_err}') # Python 3.6except Exception as err:print(f'Other error occurred: {err}') # Python 3.6else:print('Success!')

当调用.raise_for_status(), 对特定的status_code将产生1个HTTPError异常

Status_code

常用方法

如果响应内 容是json格式,可以用Response.json()方法转换成 dict类型

异常 response 消息

如果发出request后,收到异常的response, 可以用下面的数据检查 :

>>> response = requests.post('/post', json={'key':'value'})>>> response.request.headers['Content-Type']'application/json'>>> response.request.url'/post'>>> response.request.bodyb'{"key": "value"}'

3.3 GET 方法的请求参数 Query String

get方法的请求参数是通过 params={ } 方式来传递的。

response = requests.get('/search/repositories',params={'name': 'Jack','type':'display'},)

4. POST 请求

4.1 POST 请求参数

与GET请求不同的是, POST 请求参数是放在 request body 里发送的, 向 request的 response对象传入的数据类型可以是 tuple, dict, json 等。

# 发送字典post_dict = {'key1': 'value1', 'key2': 'value2'}# 发送元组post_tuple = (('key1', 'value1'), ('key1', 'value2'))# 发送jsonpost_json = json.dumps({'some': 'data'})r1 = requests.post("/post", data=post_dict)r2 = requests.post("/post", data=post_tuple)r3 = requests.post("/post", data=post_json)

输出: 以Json 格式发送 POST 请求

POST /echo/post/json HTTP/1.1Authorization: Bearer mt0dgHmLJMVQhvjpNXDyA83vA_Pxh33YAccept: application/jsonContent-Type: application/jsonContent-Length: 85Host: {"Id": 12345,"Customer": "John Smith","Quantity": 1,"Price": 10.00}

收到 Response

HTTP/1.1 200 OKContent-Length: 19Content-Type: application/json{"success":"true"}

4.2 POST 消息设置 cookie, header

import requests# 请求数据url = '/v2/member/login'cookie = "token=code_space;"header = {"cookie": cookie,"Accept": "*/*","Accept-Encoding": "gzip, deflate, br","Accept-Language": "zh-CN,zh;q=0.9","Connection": "keep-alive","Content-Type": "application/json","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"}data = {'user_id': '123456','email': '123456@'}timeout = 0.5resp = requests.post(url, headers=header, data=data, timeout=timeout) print(resp.text)print(type(resp.json()))

4.3 用 POST请求上传文件

客户端可通过POST请求,向服务器上传文件

#形式1url = '/post'#定义文件对象files = {"files":open('test.xls', 'rb')}response = requests.post(url,files = files)print(response.text)#形式2url ='/post'files = {'file': ('t.xls', open('t.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}r = requests.post(url, files=files)r.text#形式3, 发送多个文件url = '/post'files = {'file': ('t.csv', 'bb.csv')}response = requests.post(url, files=files)response.text

4. 请求与响应头部的 content-type 参数说明

Content-Type 参数告诉客户端,response实际返回数据的资源类型。这个参数在request 与 response中都可能包含,是 response 消息头部非常关键1个参数,也是开发者应该掌握的1个知识点。

语法格式示例 :

Content-Type: text/html; charset=utf-8Content-Type: multipart/form-data; boundary=something

content-type 格式为:key/value, 在http协议以及行业内,有很多通用的建议值,最常见的:

application/x-www-form-urlencoded, 这是提交表单默认的content-type设置, 对应form属性为 enctype.multipart/form-data, 用于 form 上传文件application/json传json数据text/csv传送csvtext/html传网页text/plain text/xml传文本image/jpeg传图片video/mp4传MP4视频

注:

如果key 是 text类型,附件是中文,value 加编码类型:

Content-Type: text/html; charset=UTF-8对于"application/x-www-form-urlencoded" 编码,如果两端都是用request编程,则不需要编解码,request 模块会自动完成。

下面是可能遇到的 content-type 的 key/value 列表:

5. 用 json 做 payload

payload 就是通过http Post,get发送的数据,包括请求参数,文件,图片等, 发送方可以将用json类型来准备这些数据,接收方用json解开。

这在Header 里约定好。如下, 但注意,header 不能是json格式。

POST /echo/post/json HTTP/1.1Host: Accept: application/jsonContent-Type: application/jsonContent-Length: 52{"Id": 12345}

response内容也可以用json来发送

{"success": "true","data": {"TotalOrders": 100}}

6. 其它requests 方法

>>> requests.post('/post', data={'key':'value'})>>> requests.put('/put', data={'key':'value'})>>> requests.delete('/delete')>>> requests.head('/get')>>> requests.patch('/patch', data={'key':'value'})>>> requests.options('/get')

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。