Python requests库的使用(一)
requests库官方使用手册地址:http://www.python-requests.org/en/master/;中文使用手册地址:http://cn.python-requests.org/zh_CN/latest/;
requests库作者Kenneth Reitz个人主页:https://www.kennethreitz.org/;
requests库github地址:https://github.com/requests/requests;
requests库下载方法:pip install requests
学习目的:Python+requests库实现接口自动化测试;
requests库作者Kenneth Reitz创建的server端:http://httpbin.org/;可以学习时使用。
python自带的接口测试的库urllib、urllib2、urllib3,这三个库不是进阶关系,是彼此独立的。requests库使用了urllib3(多次请求重复使用一个socket,消耗更少的资源)。
1.使用urllib、urllib2实现的一个小程序:
# -*- coding: utf-8 -*-
import urllib
import urllib2 #引入urllib、urllib2库
URL_IP = 'http://httpbin.org/ip'
URL_GET = 'http://httpbin.org/get'
def use_simple_urllib2():
response = urllib2.urlopen(URL_IP) #urlopen() 访问url的方法
print '>>>>Response Headers:'
print response.info() #info() 打印headers的方法
print '>>>>Response body:'
print ''.join([line for line in response.readlines()]) #join() 将response body中的元素以"连接生成一个新的字符串 str = "-"; seq = ("a", "b", "c"); print str.join( seq ); 结果:a-b-c
def use_params_urllib2():
#构建请求参数
params = urllib.urlencode({'param1': 'hello', 'param2': 'world'}) #urlencode() 将参数进行url编码
#发送请求
response = urllib2.urlopen('?'.join([URL_GET, '%s']) % params)
#处理响应
print '>>>>Response Headers:'
print response.info()
print '>>>>Status Code:'
print response.getcode() #getcode()获取status code的方法
print '>>>>Request body:'
print ''.join([line for line in response.readlines()])
if __name__ == '__main__':
print '>>>Use simple urllib2:'
use_simple_urllib2()
print ''
print '>>>Use params urllib2:'
use_params_urllib2()
服务器返回的数据:
C:\Python27\python.exe C:/Users/lxz/Desktop/study/AndroidAppshizhandaima/HttpApi/jiekouceshi.py
>>>Use simple urllib2:
>>>>Response Headers:
Connection: close #可以看到,一次请求后connection的状态是close,说明urllib库每次都要重新打开一个socket
Server: meinheld/0.6.1
Date: Fri, 18 Aug 2017 06:25:44 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0.000429153442383
Content-Length: 32
Via: 1.1 vegur
>>>>Response body:
{
"origin": "39.109.125.70"
}
>>>Use params urllib2:
>>>>Response Headers:
Connection: close
Server: meinheld/0.6.1
Date: Fri, 18 Aug 2017 06:25:44 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0.000815868377686
Content-Length: 309
Via: 1.1 vegur
>>>>Status Code:
200
>>>>Request body:
{
"args": {
"param1": "hello",
"param2": "world"
},
"headers": {
"Accept-Encoding": "identity",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/2.7"
},
"origin": "39.109.125.70",
"url": "http://httpbin.org/get?param2=world¶m1=hello"
}
2.使用requests实现的一个小程序:
#coding=utf-8
import requests #引入requests库
URL_IP = 'http://httpbin.org/ip'
URL_GET = 'http://httpbin.org/get'
def use_simple_requests():
response = requests.get(URL_IP) #以get方法访问url
print '>>>>Response Headers:'
print response.headers # .headers 获取headers
print '>>>>Response body:'
print response.text # .text 获取值
def use_params_requests():
params = {'param1': 'hello', 'param2': 'world'} #参数直接以字典的形式赋值,不需要编码
#发送请求
response = requests.get(URL_GET, params=params) #get方法会自动连接url和参数
#处理响应
print '>>>>Response Headers:'
print response.headers
print '>>>>Status Code:'
print response.status_code # .status_code 获取status_code方法
print '>>>>Reason:'
print response.reason # .reason 获取访问接口结果方法
print '>>>>Request body:'
print response.text # .text 获取值
if __name__ == '__main__':
print '>>>Use simple requests:'
use_simple_requests()
print ''
print '>>>Use params requests:'
use_params_requests()
服务器返回的数据:
>>>Use simple requests:
>>>>Response Headers:
{'Content-Length': '34', 'X-Processed-Time': '0.000436067581177', 'X-Powered-By': 'Flask', 'Server': 'meinheld/0.6.1', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Sat, 19 Aug 2017 08:12:17 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}
>>>>Response body:
{
"origin": "111.204.108.132"
}
>>>Use params requests:
>>>>Response Headers:
{'Content-Length': '343', 'X-Processed-Time': '0.000698089599609', 'X-Powered-By': 'Flask', 'Server': 'meinheld/0.6.1', 'Connection': 'keep-alive', 'Via': '1.1 vegur', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Sat, 19 Aug 2017 08:12:18 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}
#可以看到使用requests库,connection的状态是keep-alive,这就说明了多次请求重复使用一个socket,所以相比urllib库,requests库会消耗更少的资源
>>>>Status Code:
200
>>>>Reason:
OK
>>>>Request body:
{
"args": {
"param1": "hello",
"param2": "world"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.18.3"
},
"origin": "111.204.108.132",
"url": "http://httpbin.org/get?param2=world¶m1=hello"
}
3.发送请求
请求方法:
使用requests库发送请求的方法:requests.[method](url)
PATCH:更新资源;通过提交json数据的方式实现,相比较PUT,PATCH更轻量级。
github上公共API的使用方法地址:https://developer.github.com/v3/
使用时调用URL:https://api.github.com #可以用来日常学习使用
下面的演示用代码都会用到以上两个域名。
3.1,获取用户名方法 https://developer.github.com/v3/users
其中https://api.github.com是根域名,/users/username是endpoint。
github官网上返回数据的样例:
实现代码:
# -*- coding: utf-8 -*-
import json
import requests
URL = 'https://api.github.com'
def build_uri(endpoint):
return '/'.join([URL, endpoint])
def better_print(json_str):
return json.dumps(json.loads(json_str), indent=4)
def request_method():
response = requests.get(build_uri('users/caolanmiao'))
print better_print(response.text)
if __name__ == '__main__':
request_method()
返回的数据:
{
"public_repos": 0,
"site_admin": false,
"subscriptions_url": "https://api.github.com/users/caolanmiao/subscriptions",
"gravatar_id": "",
"hireable": null,
"id": 22490616,
"followers_url": "https://api.github.com/users/caolanmiao/followers",
"following_url": "https://api.github.com/users/caolanmiao/following{/other_user}",
"blog": "",
"followers": 0,
"location": "Pecking",
"type": "User",
"email": null,
"bio": "Software QA Engineer",
"gists_url": "https://api.github.com/users/caolanmiao/gists{/gist_id}",
"company": null,
"events_url": "https://api.github.com/users/caolanmiao/events{/privacy}",
"html_url": "https://github.com/caolanmiao",
"updated_at": "2017-08-19T09:27:39Z",
"received_events_url": "https://api.github.com/users/caolanmiao/received_events",
"starred_url": "https://api.github.com/users/caolanmiao/starred{/owner}{/repo}",
"public_gists": 0,
"name": "Yannan.Jia",
"organizations_url": "https://api.github.com/users/caolanmiao/orgs",
"url": "https://api.github.com/users/caolanmiao",
"created_at": "2016-09-28T06:00:27Z",
"avatar_url": "https://avatars0.githubusercontent.com/u/22490616?v=4",
"repos_url": "https://api.github.com/users/caolanmiao/repos",
"following": 1,
"login": "caolanmiao"
}
返回的数据信息中就是我自己的github账号,说明这次请求成功了。
注意:对于github而言,传入参数auth=('用户名','密码'),既可以完成认证。
访问user/emails API,修改上述代码的以下部分,增加auth参数,完成认证
response = requests.get(build_uri('user/emails'),auth=('caolanmiao','########'))
返回数据:
[{"email":"jia#####@outlook.com","primary":true,"verified":true,"visibility":"public"}]
[
{
"verified": true,
"email": "jia#####@outlook.com",
"visibility": "public",
"primary": true
}
]
符合API使用说明。
3.2,带参数的请求
get方式:这种参数直接拼接在url后面的参数提交方式的优点是:信息传递/页面到页面的跳转方便;缺点:明文显示,安全性差、浏览器对url的长度有限制。
post方式:安全性强,可以传递大量参数。
1.get方式实现参数传递,测试用API地址:https://developer.github.com/v3/users
since参数会过滤掉在它之前的users(比如since为11,那么只显示11之后的users)
实现代码:
# -*- coding: utf-8 -*-
import json
import requests
from requests import exceptions
URL = 'https://api.github.com'
def build_uri(endpoint):
return '/'.join([URL, endpoint])
def better_print(json_str):
return json.dumps(json.loads(json_str), indent=4)
def params_request():
response = requests.get(build_uri('users'), params={'since': 11})
print better_print(response.text)
print response.request.headers
print response.url
if __name__ == '__main__':
params_request()
2.post、patch方式实现参数传递,测试用API地址:https://developer.github.com/v3/users/emails/
实现代码:
def json_request():
response = requests.patch(build_uri('user'), auth=('caolanmiao', '########'), json={'name': 'Yannan.Jia', 'email': 'helloworld1@ceshi.com'})
response = requests.post(build_uri('user/emails'), auth=('caolanmiao', '########'), json=['helloworld2@ceshi.com'])
print better_print(response.text)
print response.request.headers
print response.request.body
print response.status_code
通过Patch方法,修改名称和邮箱;通过Post增加邮箱;
Python requests库的使用(一)的更多相关文章
- 大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。
python requests库发送请求时,比如get请求,大概过程. 一.发起get请求过程:调用requests.get(url,**kwargs)-->request('get', url ...
- python requests库学习笔记(上)
尊重博客园原创精神,请勿转载! requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.pytho ...
- Python——Requests库的开发者接口
本文介绍 Python Requests 库的开发者接口,主要内容包括: 目录 一.主要接口 1. requests.request() 2. requests.head().get().post() ...
- 使用python requests库写接口自动化测试--记录学习过程中遇到的坑(1)
一直听说python requests库对于接口自动化测试特别合适,但由于自身代码基础薄弱,一直没有实践: 这次赶上公司项目需要,同事小伙伴们一起学习写接口自动化脚本,听起来特别给力,赶紧实践一把: ...
- Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)
Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起 ...
- Python Requests库:HTTP for Humans
Python标准库中用来处理HTTP的模块是urllib2,不过其中的API太零碎了,requests是更简单更人性化的第三方库. 用pip下载: pip install requests 或者git ...
- Python Requests库
背景 Requests is an elegant and simple HTTP library for Python, built for human beings. Requests是一个优雅简 ...
- python requests库学习笔记(下)
1.请求异常处理 请求异常类型: 请求超时处理(timeout): 实现代码: import requestsfrom requests import exceptions #引入exc ...
- python+requests库,接口自动化
1.requests库的使用 requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的: “ ...
随机推荐
- Java 实践:生产者与消费者
实践项目:生产者与消费者[经典多线程问题] 问题引出: 生产者和消费者指的是两个不同的线程类对象,操作同一个空间资源的情况. 需求引出: —— 生产者负责生产数据,消费者负责取走数据 —— 生产者生产 ...
- 0基础入门学习Python(第3章)
第三章 成为高手前必须知道的一些基础知识 3.1 变量 一个值的名字,存储在内存中,我把把这块内存称为变量,大多数语言,把这个过程称之为,给变量赋值,把值存储在变量中. Python这里的做法稍有不同 ...
- SIP协议分析
- SIP流程 一个标准的SIP通话流程如下: 1. A向B发送一个INVITE消息,邀请B通话. 2.B振铃,向A回复一个RING消息,通知A振铃中,A等待. 3.B提机,向A发一个OK消息, 通 ...
- Windows下的DNS命令用法
- ipconfig 查看DNS缓存内容: ipconfig /displaydns 将显示所有缓存的DNS解析结果. 清空DNS缓存内容: ipconfig /flushdns 将清空缓存的DNS解 ...
- 【微信小程序】App.js生命周期
1.小程序的生命周期-App.js App() 必须在 app.js 中注册,且不能注册多个.所以App()方法在一个小程序中有且仅有一个. App({ onLaunch: function () { ...
- 通过Thrift实现C#与Hbase交流
近期着手的一个项目需要将我方数据存储到Hadoop的大数据环境,由于本人是.net平台的开发者,没有怎么接触过大数据(因为他实在是太高大尚了).但还好baidu, google后,还是很找到了解决办法 ...
- 配置同时使用 Gitlab、Github、Gitee(码云) 共存的开发环境
首先确认已安装Git,可以通过 git –version 命令可以查看当前安装的版本. Mac OSX 中都已经安装了Git.但是,Git的版本未必是最新的. 可以通过命令 git clone htt ...
- [PHP] 基于redis的分布式锁防止高并发重复请求
需求:我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. (3 ...
- arm-linux-gcc-4.5.1安装方法
写在前面 之前写了一篇arm-linux-gcc-5.4.0的安装方法,但是后来发现5.4.0这个版本可能有些太新了,所以又找了这个4.5.1版本(低版本),由FriendlyARM(友善之臂)提供, ...
- fiddler---Fiddler接口测试
前面介绍了Fiddler一些简单的使用功能,Fiddler不仅可以抓包也可以做接口工具使用,在没有接口文档的时候我们也可以通过Fiddler查看接口具体有哪些内容 Fiddler发送请求 在Fiddl ...