您的位置:首页 > 编程语言 > Python开发

python Requests

2016-03-15 14:43 363 查看
环境:python3

接口地址:http://httpbin.org/

目的:做接口测试使用,这里记录一下常用的操作,相对于urllib,个人觉得更喜欢这个第三方包

1.安装requests

方法1:pip install requests

方法2:下载源码=》解压=》进入解压后的文件内=》python setup.py install

2.发送不带参数的请求

r = requests.get("your url") #发送get请求
r = requests.post("your url") #发送post请求
r = requests.put("your url") #发送put请求
r = requests.delete("your url") #发送delete请求
r = requests.options("your url") #发送options请求


3.发送带参数的请求

#get请求带参数
payload = {'key1': 'value1', 'key2': 'value2', 'key3':None} #值为None的参数不会被构造进url中
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)

#结果如下:
#http://httpbin.org/get?key2=value2&key1=value1

#get请求带参数
payload = {'key1': 'value1', 'key2': 'value2', 'key3':""} #值为空字符串会被构造进url中
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url)

#结果如下
#http://httpbin.org/get?key3=&key2=value2&key1=value1

#post请求带参数
#要实现post带参数请求,只是需要简单的传递一个字典给data参数。你的数据字典在发出请求的时候会自动编码为表单形式
r = requests.post("http://httpbin.org/get", data=payload)

#post请求带参数
#如果有时候你想要发送出去的数据并非编码为表单形式,如果你传递一个string而不是一个dict,那么数据会被直接发布出去
>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}

>>> r = requests.post(url, data=json.dumps(payload))


3.定制请求头

>>> import json
>>> url = 'https://api.github.com/some/endpoint'
>>> payload = {'some': 'data'}
>>> headers = {'content-type': 'application/json'}

>>> r = requests.post(url, data=json.dumps(payload), headers=headers)


4.响应内容

import requests

payload = {'key1': 'value1', 'key2': 'value2', 'key3':""}
r = requests.post("http://httpbin.org/get", data=payload)
filename = "de.txt"
chunk_size = 1024

#响应内容
print(r.text)
#二进制响应内容
print(r.content)
#json响应内容
print(r.json())
#原始响应内容-生成器(节约内存);注意这里应该在发送请求的时候加一个参数:stream=True
r = requests.post("http://httpbin.org/get", data=payload,stream=True)
with open(filename, "wb") as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)


解析1:>>>r.text

Requests会自动解码来自服务器的内容,大多数unicode字符串都能被无缝的解码。

请求发出后,Requests会基于HTTP头部对响应的编码做出有根据的推测,当你访问r.text的时候,Requests会使用其推测的文本编码。你可以找道Requests使用了什么编码,并且能够使用r.encoding属性来改变

#查看Requests使用了什么编码来进行解码
print(r.encoding)


解析2:>>>r.content

你能以字节的方式访问请求响应体,Requests会自动为你解码gzip和deflate传输编码的响应数据

>>> r.content
b'[{"repository":{"open_issues":0,"url":"https://github.com/...


解析3:>>>r.json()

Requests中也有一个内置的json解码器,助你处理json数据

json原本是一个str类型的数据,经过json解码器的处理转换为python类型的数据,也就是dict

如果json解码失败,r.json就会抛出一个异常。(Unauthorized)

解析4:>>>r.iter_content(chunk_size)

如果你可能想要获取来自服务器的原始套接字响应,那么你可以访问r.raw.如果你确实要这么干,那么请你确保在初始请求中设置了stream=True

>>> r = requests.get('https://github.com/timeline.json', stream=True)
>>> r.raw
<requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
>>> r.raw.read(10)
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'


但一般情况下,你应该下面的模式将文本流保存到文件:

with open(filename, 'wb') as fd:
for chunk in r.iter_content(chunk_size):
fd.write(chunk)


使用 Response.iter_content 将会处理大量你直接使用 Response.raw 不得不处理的。 当流下载时,上面是优先推荐的获取内容方式。

5.获取状态码

import requests

r = requests.get("http://httpbin.org/ip")
#响应状态码
print(r.status_code)
#Requests还附带了一个内置的状态码查询对象
print(requests.codes.ok)


6.获取响应的header

import requests

r = requests.get("http://httpbin.org/ip")
print(r.headers)
print(type(r.headers)) #以字典的形式返回
print(r.headers["Content-Type"]) #根据字典的获取内容形式进行获取
print(r.headers.get("Content-Type"))


7.超时

你可以告诉Requests在经过以timeout参数设定的秒数时间之后停止等待响应

>>> requests.get('http://github.com', timeout=0.001)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)


timeout仅仅对链接过程有效,与响应体的下载无关

8.cookies

>>> url = 'http://example.com/some/cookie/setting/url'
>>> r = requests.get(url)

>>> r.cookies['example_cookie_name']
'example_cookie_value'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  接口测试 Requests