12 import json
13 import requests
14
15
16 class HttpRequests(object):
17 """
18 eg: request = HttpRequests()
19 response = request(method, url, data)
20 or
21 response = request.send_request(method, url, data)
22 print(response.text)
23 """
24 def __init__(self):
25 self.session = requests.Session()
26
27 def send_request(self, method, url, params_type='form', data=None, **kwargs):
28 method = method.upper()
29 params_type = params_type.upper()
30 if isinstance(data, str):
31 try:
32 data = json.loads(data)
33 except Exception:
34 data = eval(data)
35 if 'GET' == method:
36 response = self.session.request(method=method, url=url, params=data, **kwargs)
37 elif 'POST' == method:
38 if params_type == 'FORM': # 发送表单数据,使用data参数传递
39 response = self.session.request(method=method, url=url, data=data, **kwargs)
40 elif params_type == 'JSON': # 如果接口支持application/json类型,则使用json参数传递
41 response = self.session.request(method=method, url=url, json=data, **kwargs)
42 else: # 如果接口需要传递其他类型的数据比如 上传文件,调用下面的请求方法
43 response = self.session.request(method=method, url=url, **kwargs)
44 # 如果请求方式非 get 和post 会报错,当然你也可以继续添加其他的请求方法
45 else:
46 raise ValueError('request method "{}" error ! please check'.format(method))
47 return response
48
49 def __call__(self, method, url, params_type='form', data=None, **kwargs):
50 return self.send_request(method, url,
51 params_type=params_type,
52 data=data,
53 **kwargs)
54
55 def close_session(self):
56 self.session.close()
57 try:
58 del self.session.cookies['JSESSIONID']
59 except:
60 pass
61
62
63 request = HttpRequests()
64
65
66 if __name__ == '__main__':
67 pass
这个封装只针对了get请求和post请求,当然你也可以把put,delete等请求添加在32行代码后面,实现更多的请求方式
解释一下30-34行代码: 这几行数据是为了把json和字符串类型的数据转换为字典的格式(通过使用字典传递接口参数)且可以处理一些特殊的形式,比如下面这样的格式
'{"mobilephone": None, "pwd": null}' # 字符串类型的,但是即不是json形式的字符串,也不是字典类型的字符串,因为字典里面没有null
data
大多数post请求的接口默认支持参数类型Content-Type为application/x-www-form-urlencoded, 它告诉我们请求的接口参数需要传递一个form表单,那么我们往往是通过构造一个字典来传递form表单的,
所以当我们向服务器提交form表单时就可以使用data参数,它会接收一个字典类型的数据,存放到请求体中,然后发送给服务器(参数需是字典类型)json
首先你访问的接口需要支持content_type为application/json格式的数据类型,那么你就可以通过json这个参数来传递接口参数(参数可以是字典也可以是json类型)
params和data区别
1. 发送get请求时,由于get请求没有请求体,请求参数只能跟在url地址后的,而且服务器也只能通过解析url获得请求的参数,因此get()方法发送get请求时只能使用params参数,它会把请求的参数默认追加到url地址后面
2. 通常情况下用户需要提交某些数据时,发送的请求一般都为post请求,post请求会提交一个form表单,那么我们就可以构造一个字典格式的数据,使用data参数传递,由于post请求是有请求体的,而且请求参数就存放在请求体中,服务器也只能通过解析请求体中内容而获得请求的参数,所以post请求不能使用params传递接口参数,只能使用data,json,file等, data参数会把请求参数放到请求体中