Python实现HTTP请求

一、四种常见POST请求

requests是使用python编写实现的http库,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。

requests会自动实现持久连接keep-alive

针对HTTP的POST请求,以下对Content-Type的四种格式使用requests实现进行说明。

1.1 application/x-www-form-urlencoded 格式

application/x-www-form-urlencoded是POST请求最常见,也是默认的格式。它要求数据字段名称和值之间以等号连接,与另一组数据字段之间用&连接;以form表单形式提交数据。

1
param1=1&param2=2

以下是使用requests的示例代码

1
2
data = {'param1':'1', 'param2':'2'}
result = requests.post('http://127.0.0.1', data)

如使用类来组织请求参数,请参照以下的示例代码

1
2
3
4
5
6
7
class ReqParams:
    def __init__(self, param1, param2):
    self.param1 = param1
    self.param2 = param2

data = ReqParams(1, 2).__dict__
result = requests.post('http://127.0.0.1', data)

1.2 application/json 格式

application/json 格式的请求头部用于通知服务器,通过POST请求提交的消息主体(body)是序列化后的JSON字符串。以下是使用requests的示例代码

1
2
data = {'param1':'1', 'param2':'2'}
result = requests.post('http://127.0.0.1', json.dumps(data))

如使用类来组织请求参数,请参照以下的示例代码

1
2
3
4
5
6
7
class ReqParams:
    def __init__(self, param1, param2):
    self.param1 = param1
    self.param2 = param2

data = ReqParams(1, 2).__dict__
result = requests.post('http://127.0.0.1', json.dumps(data))

1.3 text/xml 格式

text/xml 格式的请求头部用于通知服务器,通过POST请求提交的消息主体(body)是序列化后的 xml 字符串。以下是使用requests的示例代码

1
2
3
xml = """my xml"""
headers = {'Content-Type': 'application/xml'}
requests.post('http://127.0.0.1', data=xml, headers=headers)

1.4 multipart/form-data 格式

multipart/form-data 格式应用于文件上传功能的表单,以下是使用requests的示例代码

1
2
3
url = 'http://127.0.0.1'
upload_file = {'file': open('C://Users//Administrator//Desktop//test.jpg', 'rb')}
result = requests.post(url, files=upload_file)

二、GET请求

2.1 无参数实例

1
2
url = 'http://127.0.0.1'
result = requests.get(url)

2.2 有参数实例

我们可以通过程序将参数按 GET 请求的要求,使用字符串拼接的方式来完成参数的拼接,也可以将参数以字典的形式,传入给 requests,由 requests 完成转换的工作。

1
2
data = {'param1':'1', 'param2':'2'}
result = requests.get('http://127.0.0.1', params=data)

如使用类来组织请求参数,请参照以下的示例代码

1
2
3
4
5
6
7
class ReqParams:
    def __init__(self, param1, param2):
    self.param1 = param1
    self.param2 = param2

data = ReqParams(1, 2).__dict__
result = requests.get('http://127.0.0.1', params=data)

三、Session

经常很多请求只有在登录后才能进行,实现登录效果一般的做法是执法登录请求,然后从返回结果中提取sessionid放入自定义cookie中。

requests提供了更简单的方法,直接使用 requests.Session 类请求即可,其保持登录是保留之前请求中服务端通过 set-cookie 等设置的参数。

1
2
3
4
5
s = Session()
url='http://docs.python-requests.org/en/master/'

# 所有方法和直接使用requests时一样用即可
s.get(url)

参考

  1. Python-requests模块详解
  2. Requests: HTTP for Humans
  3. Requests高级用法