Skip to content

Python request 接口测试

一、requests 库安装

python
pip install requests

二、http 请求类型

  • get: 获取资源
  • post :增加资源
  • put: 修改资源
  • delete: 删除资源
  • head: 查看响应头
  • options: 查看可用请求方法

三、Content-Type 编码方式

  • application/x-www-form-urlencoded 默认地,表单数据会编码为 “application/x-www-form-urlencoded”。就是说,在发送到服务器之前,所有字符都会进行编码,空格转换为 “+” 加号,特殊符号转换为 ASCII HEX 值。 窗体数据被编码为:名称/值对,这是标准的编码格式。

  • application/json 数据以 JSON 形式进行编码

  • multipart/form-data 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分,上传附件用到。在使用包含文件上传控件的表单时,必须使用该值。

  • text/html 文本方式的网页文件。

  • text/xml 文本方式的 XML 文件,text/xml 忽略 XML 头所指定编码格式而默认采用 US-ASCII 编码。

  • text/plain 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。空格转换为 “+” 加号,但不对特殊字符编码。

  • application/xml 数据以 XML 形式进行编码,application/xml 会根据 XML 头指定的编码格式来编码。

requests_01

四、get 请求

  • 语法
requests.get(url, params=None, **kwargs) 
response = requests.request("get", "http://www.baidu.com/")
  • 参数 url
调用接口地址 
如:url=“http://httpbin.org/get” params 
为可选参数,该参数是一个字典类型,数据会以键/值对的形式置于 URL 中,跟在一个问号的后面 

如: https://api.github.com/events?key1=value1&key2=value2 **kwargs
  • 其他可选参数

如 headers,files,cookies,auth,timeout,JSON 等 headers 请求头信息,与浏览器交互的参数

  • 代码演示
python
import requests
import pprint
get_url='http://httpbin.org/get'
get_params={'key1':'value1','key2':'value2'}
res=requests.get(url=get_url,params=get_params)
pprint.pprint(res.json())

五、post 请求

  • 语法
requests.post(url, data=None, json=None, **kwargs)
  • 参数
- > url
调用接口地址
如:url=“http://httpbin.org/post”

- >  data
为可选参数
如:字典、元组列表、字节或类似文件

- > JSON
可选参数,JSON 数据

- > **kwargs
其他可选参数
如 headers,files,cookies,auth,timeout,JSON 等

- > headers
请求头信息,与浏览器交互的参数

- > data 与 JSON 区别 
data:默认使用 application/x-www-form-urlencoded 编码方式处理
JSON:默认使用 application/json 编码方式处理
  • 代码演示
python
import requests
import pprint
#data 接收,传入 dict,不设置 content-type 值
post_url='http://httpbin.org/post'
post_data={'key1':'value1','key2':'value2'}
res=requests.post(url=post_url,data=post_data)
pprint.pprint(res.json())

import requests
import pprint
#json 接收,传入 dict,不设置 content-type 值
post_url='http://httpbin.org/post'
post_data={'key1':'value1','key2':'value2'}
res=requests.post(url=post_url,json=post_data)
pprint.pprint(res.json())

import requests
import pprint
#data 接收,传入 dict,设置 content-type:application/json
post_url='http://httpbin.org/post'
post_data={'key1':'value1','key2':'value2'}
header={'Content-type':'application/json;charset=UTF-8'}
res=requests.post(url=post_url,data=post_data,headers=header)
pprint.pprint(res.json())

import requests
import pprint
#json 接收,传入 dict,设置 content-type:application/x-www-form-urlencoded
post_url='http://httpbin.org/post'
post_data={'key1':'value1','key2':'value2'}
header={'Content-type':'application/x-www-form-urlencoded;charset=UTF-8'}
res=requests.post(url=post_url,json=post_data,headers=header)
pprint.pprint(res.json())

六、POST 与 GET 区别

  • 参数传递
    GET:从服务器获取数据,将数据按照 variable=value 的形式,添加到行为所指向的 URL 后面,并且两者使用“?”连接, 而各个变量之间使用“&”连接。
    POST:向服务器传送数据,将表单中的数据放在请求体中,按照变量和值相对应的方式传递。
  • 长度限制
    GET:GET 是通过 URL 提交数据,因此 GET 可提交的数据量就跟 URL 所能达到的最大长度有直接关系。
    实际上 HTTP 协议对 URL 长度是没有限制的,限制 URL 长度大多数是浏览器或者服务器的配置参数。
    POST:HTTP 协议没有对 POST 进行任何限制,一般是受服务器配置限制或者内存大小。 可以通过修改配置文件来设置。
  • 安全性
    GET:GET 请求参数放在 URL 后面,可以直接看到,明文传输。
    POST:POST 请求参数放在请求体里面,需要通过抓包工具或者浏览器调试模式才能看到。
  • 幂等性
    幂等主要是为了处理同一个请求重复发送的情况。
    比如在请求响应前失去连接,如果方法是幂等的,重复发送对结果没有影响。
    通常情况下 GET 请求是幂等的,POST 请求非幂等的。

七、Cookies 和 Session

Cookies

如果一个响应中包含了cookie,那么我们可以利用 cookies参数拿到:

python
 
import requests
 
response = requests.get("http://www.baidu.com/")
 
# 7. 返回CookieJar对象:
cookiejar = response.cookies
 
# 8. 将CookieJar转为字典:
cookiedict = requests.utils.dict_from_cookiejar(cookiejar)
 
print cookiejar
 
print cookiedict

运行结果:

python
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
 
{'BDORZ': '27315'}

Session

在 requests 里,session 对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开。

会话能让我们在跨请求时候保持某些参数,比如在同一个 Session 实例发出的所有请求之间保持 cookie 。

实现人人网登录

python
import requests
 
# 1. 创建session对象,可以保存Cookie值
ssion = requests.session()
 
# 2. 处理 headers
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
 
# 3. 需要登录的用户名和密码
data = {"email":"mr_mao_hacker@163.com", "password":"alarmchime"}  
 
# 4. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
ssion.post("http://www.renren.com/PLogin.do", data = data)
 
# 5. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = ssion.get("http://www.renren.com/410043129/profile")
 
# 6. 打印响应内容
print response.text

requests_02

处理HTTPS请求 SSL证书验证

Requests也可以为HTTPS请求验证SSL证书:

  • 要想检查某个主机的SSL证书,你可以使用 verify 参数(也可以不写)
python
import requests
response = requests.get("https://www.baidu.com/", verify=True)
 
# 也可以省略不写
# response = requests.get("https://www.baidu.com/")
print r.text

运行结果:

python
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge>百度一下,你就知道 ....
  • 如果SSL证书验证不通过,或者不信任服务器的安全证书,则会报出SSLError,据说 12306 证书是自己做的:

requests_03

来测试一下:

python
import requests
response = requests.get("https://www.12306.cn/mormhweb/")
print response.text

果然: SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

如果我们想跳过 12306 的证书验证,把 verify 设置为 False 就可以正常请求了。

python
r = requests.get("https://www.12306.cn/mormhweb/", verify = False)

文档参考

参考文档1

参考文档2