Python 标准库中的 urllib2 模块提供了你所需要的大多数 HTTP 功能,但是它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。

总之,大家以后对urllib2库敬而远之就行了。来拥抱Requests吧。

Requests的官方文档:http://cn.python-requests.org/zh_CN/latest/

通过下面方法安装requests

pip install requests

2、Requests如何发送HTTP请求

非常简单,先导入requests,

import requests 

然后,按照下面的方法发送http的各种请求:

r = requests.get('https://github.com/timeline.json')  
r = requests.post("http://httpbin.org/post")  
r = requests.put("http://httpbin.org/put")  
r = requests.delete("http://httpbin.org/delete")  
r = requests.head("http://httpbin.org/get")  
r = requests.options("http://httpbin.org/get")

3、为URL传递参数

如果http请求需要带URL参数(注意是URL参数不是body参数),那么需要将参数附带到payload字典里头,按照下面的方法发送请求:

import requests  
payload = {'key1': 'value1', 'key2': 'value2'}  
r = requests.get("http://httpbin.org/get",params=payload)  
print r.url 

通过print(r.url)能看到URL已被正确编码:

http://httpbin.org/get?key2=value2&key1=value1

注意字典里值为 None 的键都不会被添加到 URL 的查询字符串里。

4、unicode响应内容

import requests  
r = requests.get('https://github.com/timeline.json')  
r.text 

响应结果是:

{"message":"Hello there, wayfaring stranger. If you're reading this then you probably didn't see our blog post a couple of years back announcing that this API would Go away: http://Git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead.","documentation_url":"https://developer.github.com/v3/activity/events/#list-public-events"}

Requests会自动解码来自服务器的内容。大多数unicode字符集都能被无缝地解码。请求发出后,Requests会基于HTTP头部对响应的编码作出有根据的推测。当你访问r.text之时,Requests会使用其推测的文本编码。你可以找出Requests使用了什么编码,并且能够使用r.encoding 属性来改变它

>>> r.encoding
'utf-8'

5、二进制响应内容

如果请求返回的是二进制的图片,你可以使用r.content访问请求响应体。

import requests  
from PIL import Image  
from StringIO import StringIO  
r = requests.get('http://cn.python-requests.org/zh_CN/latest/_static/requests-sidebar.png')  
i = Image.open(StringIO(r.content))  
i.show()  

6、JSON响应内容

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

import requests  
r = requests.get('https://github.com/timeline.json')  
print r.json()

r.json将返回的json格式字符串解码成python字典。r.text返回的utf-8的文本。

7、定制请求头

如果你想为请求添加HTTP头部,只要简单地传递一个 dict 给headers 参数就可以了。

import requests  
import  json  
payload = {'some': 'data'}  
headers = {'content-type': 'application/json'}  
r = requests.get('https://github.com/timeline.json', data=json.dumps(payload), headers=headers)  
print r.json()  

注意,这里的payload是放到body里面的,所以params参数要使用json数据。

8、POST请求

就像上面‘定制请求头’中的例子,将payload序列化为json格式数据,传递给data参数。

9、POST提交文件

先制作一个text文件,名为‘report.txt’,内容是‘this is a file’。Requests使得上传多部分编码文件变得很简单:

import requests  
  
url = 'http://httpbin.org/post'  
files = {'file': open('report.txt', 'rb')}  
r = requests.post(url, files=files)  
print r.text

返回结果是:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/flaskexample/postfile.py  
{  
  "args": {},   
  "data": "",   
  "files": {  
    <strong>"file": "this is a file"</strong>  
  },   
  "form": {},   
  "headers": {  
    "Accept": "*/*",   
    "Accept-Encoding": "gzip, deflate",   
    "Content-Length": "160",   
    "Content-Type": "multipart/form-data; boundary=a3b41a6300214ffdb55ddbc23dfc0d91",   
    "Host": "httpbin.org",   
    "User-Agent": "python-requests/2.7.0 CPython/2.7.9 Windows/2012Server"  
  },   
  "json": null,   
  "origin": "202.108.92.226",   
  "url": "http://httpbin.org/post"  
}  
  
  
Process finished with exit code 0

10、POST提交表单

传递一个字典给 data 参数就可以了。数据字典在发出请求时会自动编码为表单形式:

>>> payload = {'key1': 'value1', 'key2': 'value2'}  
>>> r = requests.post("http://httpbin.org/post", data=payload)  

查看响应内容:

>>> print r.text
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "key1": "value1",
    "key2": "value2"
  },
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Content-Length": "23",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.6.0 CPython/2.7.10 Windows/7"
  },
  "json": null,
  "origin": "124.251.251.2",
  "url": "http://httpbin.org/post"
}

11、响应状态码

使用r.status_code返回响应的状态码。

import requests  
  
r = requests.get('http://httpbin.org/get')  
print r.status_code

为方便引用,Requests还附带了一个内置的状态码查询对象:

print r.status_code == requests.codes.ok

12、失败请求抛出异常

如果发送了一个失败请求(非200响应),我们可以通过 Response.raise_for_status()来抛出异常:

import requests  
  
bad_r = requests.get('http://httpbin.org/status/404')  
print bad_r.status_code  
bad_r.raise_for_status()  

返回结果是:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/flaskexample/postfile.py  
404  
Traceback (most recent call last):  
  File "C:/Users/Administrator/PycharmProjects/flaskexample/postfile.py", line 5, in <module>  
    bad_r.raise_for_status()  
  File "C:\Python27\lib\site-packages\requests\models.py", line 851, in raise_for_status  
    raise HTTPError(http_error_msg, response=self)  
<strong>requests.exceptions.HTTPError: 404 Client Error: NOT FOUND</strong>  
  
Process finished with exit code 1

如果返回码是200,则不会抛出异常,即:

import requests  
  
bad_r = requests.get('http://httpbin.org/get')  
print bad_r.status_code  
bad_r.raise_for_status()  

的返回结果是:

C:\Python27\python.exe C:/Users/Administrator/PycharmProjects/flaskexample/postfile.py  
200  
  
Process finished with exit code 0 

13、响应头

我们可以查看以一个Python字典形式展示的服务器响应头:

读取全部头部:

r.headers  

返回:

{
'content-encoding': 'gzip',
'transfer-encoding': 'chunked',
'connection': 'close',
'server': 'nginx/1.0.4',
'x-runtime': '148ms',
'etag': '"e1ca502697e5c9317743dc078f67693f"',
'content-type': 'application/json'
}

读取某一个头部字段:

r.headers['Content-Type']  
r.headers.get('content-type')

14、Cookies

得到响应中包含的一些Cookie:

>>> url = 'http://example.com/some/cookie/setting/url'  
>>> r = requests.get(url)  
  
>>> r.cookies['example_cookie_name']  
'example_cookie_value'  

要想发送你的cookies到服务器,可以使用 cookies 参数:

>>> url = 'http://httpbin.org/cookies'  
>>> cookies = dict(cookies_are='working')  
  
>>> r = requests.get(url, cookies=cookies)  
>>> r.text  

返回结果:

u'{\n  "cookies": {\n    "cookies_are": "working"\n  }\n}\n'

15、重定向与请求历史

默认情况下,除了 HEAD, Requests会自动处理所有重定向。

可以使用响应对象的 history 方法来追踪重定向。

>>> r = requests.get('http://github.com')  
>>> r.url  
'https://github.com/'  
>>> r.status_code  
200  
>>> r.history  
[<Response [301]>]  

如果你使用的是GET, OPTIONS, POST, PUT, PATCH 或者 DELETE,,那么你可以通过 allow_redirects 参数禁用重定向处理:

>>> r = requests.get('http://github.com', allow_redirects=False)  
>>> r.status_code  
301  
>>> r.history  
[]  

如果你使用的是HEAD,你也可以启用重定向:

>>> r = requests.head('http://github.com', allow_redirects=True)  
>>> r.url  
'https://github.com/'  
>>> r.history  
[<Response [301]>]

python requests接口测试的更多相关文章

  1. Python+Requests接口测试教程(1):Fiddler抓包工具

    本书涵盖内容:fiddler.http协议.json.requests+unittest+报告.bs4.数据相关(mysql/oracle/logging)等内容.刚买须知:本书是针对零基础入门接口测 ...

  2. python requests 接口测试

    1.get方法请求接口 url:显而易见,就是接口的地址url啦 headers:请求头,例如:content-type = application/x-www-form-urlencoded par ...

  3. Python+Requests接口测试教程(2):

    开讲前,告诉大家requests有他自己的官方文档:http://cn.python-requests.org/zh_CN/latest/ 2.1 发get请求 前言requests模块,也就是老污龟 ...

  4. Python+Requests接口测试教程(2):requests

    开讲前,告诉大家requests有他自己的官方文档:http://cn.python-requests.org/zh_CN/latest/ 2.1 发get请求 前言requests模块,也就是老污龟 ...

  5. python requests接口测试系列:连接mysql,获取mysql查询的值作为接口的入参

    主要思路: 连接mysql数据库,这里数据库需要使用Proxifier来设置代理,然后才能正常连接 获取mysql数据库中某一数据,作为接口的参数信息 将接口返回结果保存至csv数据表中 # -*- ...

  6. 基于python+requests的简单接口测试

    在进行接口测试时,我们可以使用已有的工具(如:jmeter)进行,也可以使用python+requests进行.以下为简单的接口测试模板: 一.提取常用变量,统一配置 新建一个config.py文件, ...

  7. 基于Python Requests的数据驱动的HTTP接口测试

    发表于:2017-8-30 11:56  作者:顾翔   来源:51Testing软件测试网原创 http://www.51testing.com/html/69/n-3720769-2.html   ...

  8. python requests库学习笔记(上)

    尊重博客园原创精神,请勿转载! requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.pytho ...

  9. 转载:python + requests实现的接口自动化框架详细教程

    转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...

随机推荐

  1. CentOS7下Docker的安装与使用

    前言 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到 ...

  2. asp.net中Request请求参数的自动封装

    这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns= ...

  3. [django]drf知识点梳理-权限

    用户 - 权限 - 资源 (拥有) (绑定) django权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮 django权限控制 Djan ...

  4. docker端口映射,批量删除容器

    docker端口映射 http://blog.csdn.net/yjk13703623757/article/details/69212521 批量删除容器 http://blog.csdn.net/ ...

  5. sklearn.svm.LinearSVC文档学习

    https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC 1 ...

  6. 《大道至简》第一章读后感Java伪代码

    在<大道至简>第一章中,周爱民先生引用一则<愚公移山>的寓言,引出了编程的根本:顺序.选择.循环.“愚公移山”的工程虽然庞大,但是可以通过极其简单的变成来完成.我身边的有一些人 ...

  7. iOS 新浪微博-5.2 首页微博列表_转发微博/工具栏

    继续于上一篇,还是做首页的功能,这一篇把剩下的首页继续完善. 看看上面的图片,分析: 1.转发微博里面的内容,和原创微博是一样的,由文字+配图组成.这应该放在一个UIView里处理. 2.工具栏也当成 ...

  8. iOS UI进阶-1.1 Quartz2D 图片水印/裁剪/截图

    图片水印 UIImage+MJ.h #import <UIKit/UIKit.h> @interface UIImage (MJ) /** * 打水印 * * @param bg 背景图片 ...

  9. T Y P E L I B R A R I E S库加载

    #---------------------------------------------------------------------------- # T Y P E L I B R A R ...

  10. 初识github之注册和基本概念

    通过大量的网络资源,我粗浅了解了GitHub是什么:一个开源的代码存储云平台,它的logo是一只 “章鱼猫(Octocat)”.那么开始学习GitHub第一部分——注册GitHub账号. 首先英文就让 ...