Source code for InterfaceLibrary.HttpLibrary

# coding: utf-8
from urllib import urlencode
import httplib2
import requests
import robot
from robot.libraries.BuiltIn import BuiltIn
import json
import sys
import os

reload(sys)
sys.setdefaultencoding('utf-8')


[docs]class HttpLibrary(object): """Http Client""" ROBOT_LIBRARY_SCOPE = 'GLOBAL' def __init__(self): self._cache = robot.utils.ConnectionCache(u'未创建sessions') self.builtin = BuiltIn() self.alias = None self.host = None self.port = None self.cookie = None
[docs] def create_session(self, host, port, Alias): """Create Session : 创建一个连接host server的HTTP会话 `Alias` 对当前会话指定别名,在Http请求中可用于识别在高速缓存中的Session对象 也可参考robotframework-requests库中create session关键字 Examples: | Create Session | &{enviro}[host] | &{enviro}[port] | alias | """ self.alias = Alias self.host = host self.port = port url = self._checkport() session = requests.Session() res = session.get(url) self._cache.register(session, alias=self.alias)
[docs] def post_request(self, uri, data=None, para=None): """Issues a HTTP POST request. `uri` 请求路径 `para` 追加在URL后面的参数,键值字典或Json格式,URL长度有限制,最多只能是1024字节. `data` 在POST请求的HTTP消息主体中发送的数据,键值字典或Json格式 也可参考robotframework-requests库中post request关键字 Examples: | ${res} | Post Request | /checkUser.do | {'userName':'&{account}[username]','password':'&{account}[password]'} | None |#登录接口获取cookie | ${res} | Post Request | /manualreply/addClassify.p | {'name':'${name}'} | None | """ session = self._cache.switch(self.alias) url = self._get_url(uri) print "HttpRequest Url is " + url if self.cookie == None: response = session.post(url, data=eval(data)) if 'Set-Cookie' in response.headers.keys(): self.cookie = response.headers['Set-Cookie'] return self._replace_null(response.content).decode('utf-8') else: return self._replace_null(response.content).decode('utf-8') else: if str(para) == 'None' and str(data) == 'None': response = session.post(url, cookies={'Cookie':self.cookie}) elif str(para) != 'None' and str(data) == 'None': response = session.post(url, params=eval(para), cookies={'Cookie':self.cookie}) elif str(para) == 'None'and str(data) != 'None': response = session.post(url, data=eval(data), cookies={'Cookie':self.cookie}) else: if type(eval(data)) == dict and type(eval(para)) == dict: response = session.post(url, params=eval(para), data=eval(data), cookies={'Cookie':self.cookie}) else: print "please confirm data type,data is not json or dict" return self._replace_null(response.content).decode('utf-8')
[docs] def post_file_request(self, uri, file, data=None, para=None): """Issues a HTTP Post Request to upload file. `file` file must be dictionary of {filename: fileobject} files to multipart upload. `para` dictionary of URL parameters to append to the URL. `data` the body to attach to the request must be a python dictionary. 文件类型字段以参数或请求体参数传入 Examples: | ${res} | Post File Request | /cgi-bin/file/upload | {'content':open('Resources/Material/logo.jpg','rb')} | {'type':'jpg'} | {'access_token':'${access_token}'} | """ session = self._cache.switch(self.alias) url = self._get_url(uri) print "HttpRequest Url is " + url if para == None: response = session.post(url, files=eval(file), data=eval(data), cookies={'Cookie':self.cookie}) else: response = session.post(url, files=eval(file), params=eval(para), data=eval(data), cookies={'Cookie':self.cookie}) return self._replace_null(response.content).decode('utf-8')
[docs] def get_request(self, uri, para=None): """Issues a HTTP Get Request. `para` 追加在URL后面的参数,键值字典或Json格式,URL长度有限制,最多只能是1024字节. `uri` 可以是请求路径,也可以是带host的url Examples: | ${res} | Get Request | /cgi-bin/jssdk/ticket / {'access_token':'${acces_token}'} |${res} | post request | /weblogin/user/generate | {"mac":"${mac}"} | None | | ${resdic} | Evaluate | ${res} | | Set Suite Variable | ${url} | ${resdic['result']['url']} | | ${res} | get request | ${url} | {'uid':'${uidencode}','timestamp':'${strtime}','signature':'${sign}','unique':'${unique}'} | """ session = self._cache.switch(self.alias) if self.host in uri: url = uri else: url = self._get_url(uri) print "HttpRequest Url is " + url if self.cookie == None: response = session.get(url, params=eval(para)) if 'Set-Cookie' in response.headers.keys(): self.cookie = response.headers['Set-Cookie'] return self._replace_null(response.content).decode('utf-8') else: return self._replace_null(response.content).decode('utf-8') else: if para == 'None': response = session.get(url, cookies={'Cookie':self.cookie}) else: response = session.get(url, params=eval(para), cookie={'Cookie':self.cookie}) return self._replace_null(response.content).decode('utf-8')
[docs] def encrypt_post(self,para,body,headers): """Issues a encrpyt Http Post Request `para` 键值字典或json格式 `body` 加密后的请求体。加密前键值字典格式,加密后可能是字符串格式 `headers` 根据相应的请求加密算法定制请求头 键值字典格式,例如可包含时间戳,请求唯一标示符,对请求体的签名,用户Id等 返回的response 内容也是加密后的,需要相对应的解密算法来解密。 Examples: | ${enres} | encrpyt post | {"c":"100"} | ${enbody} | {'Content-Type':'text/plain','time':'${strtime}','unique':'${unique}','sign':'${sign}','uid':'','ua':'IOS/1.0'} | """ if para == 'None': url = self._checkport() else: url = self._checkport() + '?' + str(self._encodepara(para)) print 'HttpPost url is ' + url http = httplib2.Http(".cache", disable_ssl_certificate_validation=True) resp,content = http.request(url,'POST', headers=eval(headers), body=body) return content
[docs] def delete_request(self, uri, para, data, headers): """ Issues a HTTP DELETE request. `headers` 请求以字典格式的报头 """ session = self._cache.switch(self.alias) url = self._get_url(uri) response = session.delete(url, params=eval(para), data=eval(data),headers=headers,cookies=self.cookie) return self._replace_null(response.content).decode('utf-8')
[docs] def head_request(self, uri, headers): """Issues a HTTP HEAD request. `headers` 请求以字典格式的报头 """ session = self._cache.switch(alias) url = self._get_url(uri) print "HttpRequest Url is " + url response = session.head(url, headers=headers, cookies=self.cookie) return self._replace_null(response.content).decode('utf-8')
def _get_url(self, uri): ''' Helper method to get the full url ''' url = self._checkport() if uri: slash = '' if uri.startswith('/') else '/' url = "%s%s%s" % (url, slash, uri) return url def _replace_null(self, response): strres = json.dumps(response, ensure_ascii=False) return eval(strres.replace('null', '\\"null\\"').replace('false', '\\"false\\"').replace('true', '\\"true\\"')) def _checkport(self): if self.port == '0': url = self.host else: url = self.host + ':' + self.port return url def _encodepara(self, para): encodepara = urlencode(eval(para)) return encodepara