最近工作原因在研究RobotFramework对REST测试的方案,找到几个相关类库。但使用requests感觉更方便,研究了一下requests类库的源码,并将注释换成中文为方便使用。关于Requests类库的源码找到两个版本,VCR版本,另一个下面这个算是普通版吧。关于VCR部分的内容还在研究,稍后发出来。

[lang=python]

#! /url/bin/python
# -*- coding: UTF-8 -*-

import requests import
import json
from urllib import urlencode
from robot.libraries.BuiltIn import BuiltIn
from robot import utils
try:
from requests_ntlm import HttpNtlmAuth
except ImportError:
pass

class RestKeywords(object):
ROBOT_LIBRARY_SCOPE = 'Global'

def __init__(self):
self._cache = utils.ConnectionCache(u'未创建Sessions')
self.builtin = BuiltIn()

def _utf8_urlencode(self, data):
if isinstance(data, unicode):
return data.encode('utf-8')

if not isinstance(data, dict):
return data

utf8_data = {}
for k, v in data.iteritems():
utf8_data[k] = unicode(v).encode('utf-8')

return urlencode(utf8_data)

def _create_session(self, alias, url, headers, cookies,
auth, timeout, proxies, verify):
""" Create Session: 创建一个连接server的HTTP会话

`url` 服务器基本的URL地址

`alias` Robot Framework 对当前创建的HTTP会话指定的别名

`headers` 默认的headers字典

`auth` 对于HTTP基本身份验证词典的用户名和密码

`timeout` 连接超时

`proxies` 代理服务器URL

`verify` 如果请求验证证书,该值设置为True
"""

self.builtin.log(u'创建Session:%s' % alias, 'DEBUG')
session = requests.Session()
session.headers.update(headers)
session.auth = auth if auth else session.auth
session.proxies = proxies if proxies else session.proxies

session.verify = self.builtin.convert_to_boolean(verify)

# 通过传递进入说请求
# cant pass these into the Session anymore
self.timeout = timeout
self.cookies = cookies
self.verify = verify

# cant use hooks:(
session.url = url

self._cache.register(session, alias=alias)

return session

def create_session(self, alias, url, headers={}, cookies=None,
auth=None, timeout=None, proxies=None, verify=False):
""" Create Session: 创建一个连接server的HTTP会话

`url` 服务器基本的URL地址

`alias` Robot Framework 对当前创建的HTTP会话指定的别名

`headers` 默认的headers字典

`auth` 对于HTTP基本身份验证词典的['DOMAIN', '用户名', '密码']

`timeout` 连接超时

`proxies` 代理服务器URL

`verify` 如果请求验证证书,该值设置为True
"""

auth = request.auth.HTTPBasicAuth(*auth) if auth else None

return self._create_session(alias, url, headers, cookies, auth,
timeout, proxies, verify)

def create_ntln_session(self, alias, url, headers={}, cookies=None,
auth=None, timeout=None, proxies=None, verify=False):
""" Create Session: 创建一个连接server的HTTP会话

`url` 服务器基本的URL地址

`alias` Robot Framework 对当前创建的HTTP会话指定的别名

`headers` 默认的headers字典

`auth` 对于HTTP基本身份验证词典的['DOMAIN', '用户名', '密码']

`timeout` 连接超时

`proxies` 代理服务器URL

`verify` 如果请求验证证书,该值设置为True
"""
if not HttpNtlmAuth:
raise AssertionError(u'未加载Reuqest HTLM模块')
elif len(auth) != 3:
raise AssertionError(u'验证参数数量不正确 '
u'- 预期3个参数, 实际{}'.format(len(auth)))
else:
ntlm_auth = HttpNtlmAuth('{}\\{}'.format(auth[0], auth[1]), auth[2])

return self._create_session(alias, url, headers, cookies,
ntlm_auth, timeout, proxies, verify)

def delete_all_sessions(self):
"""删除所有Session对象"""

self._cache.empty_cache()

def to_json(self, content, pretty_print=False):
"""将字符串转换为一个JSON对象
        `content`字符串的内容转换成JSON
`pretty_print`如果被定义,将content输出打印JSON格式
"""
if pretty_print:
json_ = self._json_pretty_print(content)
else:
json_ = json.loads(content)
return json_

def get_request(self, alias, uri, headers=None, params={}, allow_redirects=None):
""" 使用指定别名中找到的会话对象发送GET请求

`uri` 向该uri发送GET 请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

"""
# 根据alias获取Session对象
session = self._cache.switch(alias)
# 对参数进行encode编码转换
params = self._utf8_urlencode(params)
# 判断是否允许重定向
redir = True if allow_redirects is None else allow_redirects
response = self._get_request(session, uri, headers, params, redir)

return response

def get(self, alias, uri, headers=None, params={}, allow_redirects=None):
""" * * * 警告 - 建议使用get request * * *
使用指定别名中找到的会话对象发送GET请求

`uri` 向该uri发送GET 请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

"""
print u"警告强烈反对当前使用GET方法提交请求"
session = self._cache.switch(alias)
params = self._utf8_urlencode(params)
redir = True if allow_redirects is None else allow_redirects
response = self._get_request(session, uri, headers, params, redir)

return response

def post_request(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" 使用指定别名中找到的会话对象发送POST请求

`uri` 向该uri发送POST 请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容POST的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

`files` 包含数据文件的文件名的字典才能POST到服务器

"""
# 根据alias获取Session对象
session = self._cache.switch(alias)
# 对data进行encode编码转换
data = self._utf8_urlencode(data)
# 判断是否允许重定向
redir = True if allow_redirects is None else allow_redirects
response = self._post_request(session, uri, data, headers, files, redir)

return response

def post(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" * * * 警告 - 建议使用post request * * *
使用指定别名中找到的会话对象发送POST请求

`uri` 向该uri发送POST 请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容POST的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

`files` 包含数据文件的文件名的字典才能POST到服务器

"""
print u"警告强烈反对当前使用POST方法提交请求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._post_request(session, uri, data, headers, files, redir)

return response

def patch_request(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" 使用指定别名中找到的会话对象发送PATCH请求

`uri` 向该uri发送PATCH请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容PATCH的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

`files` 包含数据文件的文件名的字典才能PATCH到服务器

"""
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._patch_request(session, uri, data, headers, files, redir)
return response

def patch(self, alias, uri, data={}, headers=None, files={}, allow_redirects=None):
""" * * * 警告 - 建议使用patch request * * *
使用指定别名中找到的会话对象发送PATCH请求

`uri` 向该uri发送PATCH请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容PATCH的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

`files` 包含数据文件的文件名的字典才能PATCH到服务器

"""
print u"警告强烈反对当前使用PATCH方法提交请求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._patch_request(session, uri, data, headers, files, redir)

return response

def put_request(self, alias, uri, data=None, headers=None, allow_redirects=None):
"""使用指定别名中找到的会话对象发送PUT请求

`uri` 向该uri发送PUT请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容PUT的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

"""
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._put_request(session, uri, data, headers, redir)

return response

def put(self, alias, uri, data=None, headers=None, allow_redirects=None):
"""* * * 警告 - 建议使用put request * * *
使用指定别名中找到的会话对象发送PUT请求

`uri` 向该uri发送PUT请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容PUT的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

"""
print u"警告强烈反对当前使用put方法提交请求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._put_request(session, uri, data, headers, redir)

return response

def delete_request(self, alias, uri, data=(), headers=None, allow_redirects=None):
""" 使用指定别名中找到的会话对象发送DELETE请求

`uri` 向该uri发送DELETE请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容DELETE的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

"""
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._delete_request(session, uri, data, headers, redir)

return response

def delete(self, alias, uri, data=(), headers=None, allow_redirects=None):
"""* * * 警告 - 建议使用delete request * * *
使用指定别名中找到的会话对象发送DELETE请求

`uri` 向该uri发送DELETE请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

`data` 将原Body内容DELETE的数据或二进帛数据转换为键值字典,并以urlencoded编码形式发送

"""
print u"警告强烈反对当前使用delete方法提交请求"
session = self._cache.switch(alias)
data = self._utf8_urlencode(data)
redir = True if allow_redirects is None else allow_redirects
response = self._delete_request(session, uri, data, headers, redir)

return response

def head_request(self, alias, uri, headers=None, allow_redirects=None):
""" 使用指定别名中找到的会话对象发送HEAD请求

`uri` 向该uri发送HEAD请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

"""
session = self._cache.switch(alias)
redir = False if allow_redirects is None else allow_redirects
response = self._head_request(session, uri, headers, redir)

return response

def head(self, alias, uri, headers=None, allow_redirects=None):
"""* * * 警告 - 建议使用head request * * *
使用指定别名中找到的会话对象发送HEAD请求

`uri` 向该uri发送HEAD请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

"""
print u"警告强烈反对当前使用head方法提交请求"
session = self._cache.switch(alias)
redir = False if allow_redirects is None else allow_redirects
response = self._head_request(session, uri, headers, redir)

return response

def options_request(self, alias, uri, headers=None, allow_redirects=None):
""" 使用指定别名中找到的会话对象发送OPTIONS请求

`uri` 向该uri发送OPTIONS请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

"""
session = self._cache.switch(alias)
redir = True if allow_redirects is None else allow_redirects
response = self._options_request(session, uri, headers, redir)

return response

def options(self, alias, uri, headers=None, allow_redirects=None):
"""* * * 警告 - 建议使用options request * * *
使用指定别名中找到的会话对象发送OPTIONS请求

`uri` 向该uri发送OPTIONS请求

`alias` 将用于识别在高速缓存中的Session 对象

`headers` 请求以字典格式的报头

"""
print u"警告强烈反对当前使用options方法提交请求"
session = self._cache.switch(alias)
redir = True if allow_redirects is None else allow_redirects
response = self._options_request(session, uri, headers, redir)

return response

def _get_request(self, session, uri, headers, params, allow_redirects):
resp = session.get(self._get_url(session, uri),
headers=headers,
params=params,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)
# 存储最后响应对象
session.last_resp = resp
self.builtin.log("GET 响应: %s DEBUG" % resp.content)
return resp

def _post_request(self, session, uri, data, headers, files, allow_redirects):
resp = session.post(self._get_url(session, uri),
data=data, headers=headers,
files=files,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

# 存储最后响应对象
session.last_resp = resp
self.builtin.log("POST 响应: %s DEBUG" % resp.content)
return resp

def _patch_request(self, session, uri, data, headers, files, allow_redirects):
resp = session.patch(self._get_url(session, uri),
data=data, headers=headers,
files=files,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)
# 存储最后响应对象
session.last_resp = resp
self.builtin.log("PATCH 响应: %s DEBUG" % resp.content)
return resp

def _put_request(self, session, uri, data, headers, allow_redirects):
resp = session.put(self._get_url(session, uri),
data=data, heaers=headers,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

self.builtin.log("PUT 响应: %s DEBUG" % resp.content)

# 存储最后响应对象
session.last_resp =resp
return resp

def _delete_request(self, session, uri, data, headers, allow_redirects):
resp = session.delete(self._get_url(session, uri), data=data,
headers=headers, cookies=self.cookies,
timeout=self.timeout,
allow_redirects=allow_redirects)

# 存储最后响应对象
session.last_resp = resp
self.builtin.log("DELETE 响应: %s DEBUG" % resp.content)
return resp

def _head_request(self, session, uri, headers, allow_redirects):
resp = session.head(self._get_url(session, uri), headers=headers,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

# 存储最后响应对象
session.last_resp = resp
self.builtin.log("HEAD 响应: %s DEBUG" % resp.content)
return resp

def _options_request(self, session, uri, headers, allow_redirects):
resp = session.head(self._get_url(session, uri), headers=headers,
cookies=self.cookies, timeout=self.timeout,
allow_redirects=allow_redirects)

# 存储最后响应对象
session.last_resp = resp
self.builtin.log("OPTIONS 响应: %s DEBUG" % resp.content)
return resp

def _get_url(self, session, uri):
"""根据Helper 模块获取完整URL"""
url = session.url
if uri:
slash = '' if uri.startswith('/') else '/'
url = "%s%s%s" % (session.url, slash, uri)

return url

def _json_pretty_print(self, content):
""" 转换为JSON 对象
'content' 将content转换为JSON object
"""
temp = json.loads(content)
return json.dumps(temp, sort_keys=True, indent=4, separators=(',', ': '))

robotframework-requests--中文注解版的更多相关文章

  1. zw版_zw中文增强版Halcon官方Delphi例程

    [<zw版·delphi与halcon系列原创教程>zw版_zw中文增强版Halcon官方Delphi例程 源码下载:http://files.cnblogs.com/files/ziwa ...

  2. 《Effective Java(中文第二版)》【PDF】下载

    <Effective Java(中文第二版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382186 Java(中文第二版)& ...

  3. Python-第三方库requests详解(附requests中文官方教程)

    转自http://blog.csdn.net/cyjs1988/article/details/73294774 Python+requests中文官方教程: http://www.python-re ...

  4. PDF Expert for Mac v2.4.22 中文破解版下载 PDF阅读编辑软件

    PDF Expert for Mac v2.4.22 中文破解版下载:http://h5ip.cn/CsRN PDF Expert for Mac, iOS 上最好用的 PDF 编辑器之一,现在终于打 ...

  5. 【APP设计利器】Sketch 41 Mac中文破解版(含汉化插件)

    Sketch是一款拥有美观界面和强大功能适用于所有设计师的专业矢量绘图工具.它旨在为美术设计师创造出一款更优秀的作品,不是复制品,而是提升品.Sketch简约的设计是基于无限的规模和层次的绘图空间,免 ...

  6. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  7. 植物大战僵尸中文第二版和年度版 游戏分析及delphi源码

    00413184 |. E8 77E30100   |CALL PlantsVs.00431500                  ; 地上的物品00413189 |. 8D7424 10     ...

  8. springMVC(注解版笔记)

    springMVC(注解版) 较之于非注解版本,发生一下变化: 1.配置文件需要配置的标签有: <!-- 包的扫描,此包下面的所有包都启用注解 --> <context:compon ...

  9. 【转】Everything中文绿色版在Win7/8用不了?

    原文网址:http://pcedu.pconline.com.cn/472/4727542.html 用过Everything的朋友应该都知道,Everything有两个版本,一个是安装版,另一个是E ...

  10. 在OS X 10.10系统上安装Navicat Premium中文破解版11.0.16教程

    此链接是Navicat Premium中文破解版11.0.16安装包里面并带有中文汉化包 http://pan.baidu.com/s/1ntjz6HF#path=%252F 一.Navicat Pr ...

随机推荐

  1. 2019.9.30 ErrorWidget 的使用

    开发过程中总会碰见页面出现错误的情况,这时候整个页面一片红, 如下 测试阶段出现这样的问题就算了,万一正式环境也出现这个就要不和谐了.所以就有了ErrorWidget.这个是要在最底层设置一下就可以屏 ...

  2. Winforms界面开发DevExpress v19.2:Map、Pivot Grid等功能增强

    DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...

  3. 什么是http协议(一)

    http协议是大家在互联网中最为熟悉的协议,只要上网大家都会遇到,但是,很多人被问道什么是http协议,http协议的内容是什么就懵了.这里,我们随便聊聊http协议. 首先,我们说说协议.我一直觉得 ...

  4. maven工程的简单构建

    1.按maven约定的目录结构创建文件夹 约定目录结构:不按约定的目录来建maven无法正常工作:         Hello         |---src         |---|---main ...

  5. JavaScript 小技巧整理

    1.过滤唯一值 Set类型是在ES6中新增的,它类似于数组,但是成员的值都是唯一的,没有重复的值.结合扩展运算符(...)我们可以创建一个新的数组,达到过滤原数组重复值的功能. const array ...

  6. Parallels Desktop 安装centos7

    配置网卡: vi /etc/sysconfig/network-scripts/ifcfg-eth0 修改BOOTPROTO=dhcp,ONBOOT=yes. 保存后重启网卡 service netw ...

  7. 「CSA Round #41」BFS-DFS

    题目链接 戳我 \(Description\) 给出一个图的\(bfs\)序和\(dfs\)序,构造出一个满足条件的图,边的扫描顺序为读入顺序 \(Solution\) 这个题还是很简单的. 先来看看 ...

  8. 「前端」尚妆 UI 组件库工程实践(weex vue)

    本文来自尚妆前端团队南洋 发表于尚妆github博客,欢迎订阅! 前言 尚妆大前端团队使用 weex 进行三端统一开发有一段时间了,截止本文发表「达人店」APP大部分页面都已经用 weex 进行了重构 ...

  9. Java多线程-程序运行堆栈分析

    class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...

  10. SRS之接收推流线程:recv

    SrsPublishRecvThread.SrsRecvThread.SrsReusableThread2.SrsThread 之间的关系图 1. recv 线程函数:SrsThread::threa ...