IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    python实现Postman

    Fish (fsh267@gmail.com)发表于 2015-01-07 00:00:00
    love 0

    之前在绿盟科技实习时,就经常在Django后端和Ajax进行大量的通信。后来很多场景需要进行测试,比如Chorme上的Postman插件和Firefox的Restful拓展。

    在开源社区上看到了有人写了一个UI界面的,http://www.oschina.net/code/snippet_1438043_44720。但是没有后端代码,参考github上的代码和原来项目中经常使用的手段,修改完成后端,重复发明轮子,以后应该用的到。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    # jhhttp, a simple API tool, support RESTful APIs
    import simplejson
    import urllib
    import urllib.request
    import traceback
    
    class RequestWithMethod(urllib.request.Request):
        def __init__(self, url, method, data=None, headers={},\
            origin_req_host=None, unverifiable=False):
            self._method = method
            urllib.request.Request.__init__(self, url, data, headers, origin_req_host,
                    unverifiable)
    
        def get_method(self):
            if self._method:
                return self._method
            else:
                return urllib.request.Request.get_method(self)
    
    class JhhttpError(Exception):
        def __init__(self, value):
            self.value = value
        def __str__(self):
            return repr(self.value)
    
    def _restful_headers(headers=None):
        if headers is None:
            headers = {}
            headers['Content-Type'] = 'application/json'
        else:
            headers['Content-Type'] = 'application/json'
        return headers
    
    def _restful_data(data):
        if type(data) is not str:
            data = simplejson.dumps(data)
        return data
    
    def _prepare_data(data):
        if type(data) is str or data is None:
            return data
        try:
            data = urllib.urlencode(data)
        except(Exception) as e:
            traceback.print_exc()
            raise JhhttpError(e)
        return data
    
    def _open(url, method, data=None, headers=None):
        if headers is None:
            headers = {}
        try:
            req = RequestWithMethod(url, method, data, headers)
            response = urllib.request.urlopen(req)
        except(Exception) as e:
            traceback.print_exc()
            raise JhhttpError(e)
        return response
    
    def _return(response, response_type):
        try:
            content = response.read()
        except(Exception) as e:
            traceback.print_exc()
            raise JhhttpError(e)
        if not content:
            return None
        if response_type is 'json':
            try:
                ret = simplejson.loads(content)
            except(Exception) as e:
                traceback.print_exc()
                raise JhhttpError(e)
        else:
            ret = content
        return ret
    
    def _check(url, data, headers):
        if headers is not None and type(headers) is not dict:
            raise JhhttpError('headers is not a dict')
    
    def _do_http(url, data=None, headers=None, method='GET', response_type='text'):
        try:
            _check(url, data, headers)
            f = _open(url, method, data, headers)
            ret = _return(f, response_type)
        except(JhhttpError)as e:
            print('JhhttpError, url = %s' % url)
            ret = None
        return ret
    
    def send(method, url, data = None, headers = None):
        method = method.upper()
        if method == 'GET':
            data = None
        else:
            data = _prepare_data(data)
        return _do_http(url, data, headers, method, 'text')
    def rest_send(method, url, data = None, headers = None):
        method = method.upper()
        headers = _restful_headers(headers)
        if method == 'GET':
            data = None
        else:
            data = _restful_data(data)
        return _do_http(url, data, headers, method, 'json')
    #-------------test------------#
    print(rest_send('get', "http://ip.taobao.com/service/getIpInfo.php?ip=124.31.34.190"))

    #END



沪ICP备19023445号-2号
友情链接