调用第三方服务API的SDK编写思路
2016-12-20 00:00
417 查看
思路
通过将SDK方法中返回的数据划分为正常返回数据以及错误返回的数据两部分,让调用者更简单的对接口调用错误进行处理。将SDK调用第三方服务接口的流程划分为: 数据准备,http请求,结果处理三部分,以重用代码。
例子
以聚合数据手机话费充值SDK编写为例, 手机话费充值接口# encoding=utf-8 from urlparse import urljoin from hashlib import md5 from datetime import datetime from random import sample import requests import pytz class APIError(object): def __init__(self, code, msg): self.code = code self.message = msg class JuhePhoneChargeApi(object): API_PREFIX = 'https://op.juhe.cn/ofpay/mobile/' def __init__(self, openid, key, api_entry=None): self._key = key self._openid = openid self._api_entry = api_entry or self.API_PREFIX def telcheck(self, phoneno, cardnum): params = {'phoneno': phoneno, 'cardnum': cardnum} return self._get(path='telcheck', params=params) def telquery(self, phoneno, cardnum): params = { 'phoneno': phoneno, 'cardnum': cardnum, } return self._get(path='telquery', params=params) def onlineorder(self, phoneno, cardnum, orderid): params = { 'phoneno': phoneno, 'cardnum': cardnum, 'orderid': orderid or self.create_orderid(), } params.update({'sign': self._create_sign(**params)}) return self._get(path='onlineorder', params=params) def ordersta(self, orderid): params = {'orderid': orderid} return self._get(path='orderid', params=params) def create_orderid(self): return ''.join(( datetime.now(tz=pytz.timezone('Asia/Shanghai')).strftime('%Y%m%d%H%M%S%f'), self._create_code(12))) def _process_response(self, rsp): """ 对第三方接口返回数据做同一处理, :param rsp: :return: 接口正常返回值, 错误对象 """ if rsp.status_code != 200: return None, APIError(rsp.status_code, 'http error') try: content = rsp.json() except: return None, APIError(99999, 'invalid rsp') if 'error_code' in content and content['error_code'] != 0: return None, APIError(content['error_code'], content['reason']) return content['result'], None def _get(self, path, params=None): if not params: params = {} headers = {'Content-type': 'application/json'} params.update({'key': self._key}) rsp = requests.get(urljoin(self._api_entry, path), params=params, headers=headers) return self._process_response(rsp) def _create_sign(self, phoneno, cardnum, orderid=None): obj_str = ''.join(( self._openid, self._key, phoneno, str(cardnum), orderid or self.create_orderid())) m = md5() m.update(obj_str) return m.hexdigest() def _create_code(self, number_len): ELEMENT = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' return ''.join(sample(ELEMENT, number_len))
相关文章推荐
- 调用第三方服务API的SDK编写思路
- 调用手机话费充值API的SDK编写思路
- 淘宝服务市场 PHP封装商品橱窗类 (仅提供思路分析,类内调用的命令还需要自己编写)
- 编写windows服务中调用activeX控件(SDK)的心得
- 淘宝服务市场 上架封装类 (仅提供思路, 类内调用的函数还需要您自己编写)
- ArcGIS JavaScript API调用Google、天地图、百度等第三方在线地图服务
- 使用Django REST Framework来快速实现API调用服务——下篇(编写API服务)
- Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI
- 语义Web服务的API使用实例:OWL-S API结合matchmaker、推理机(Jena、Pellet)进行语义转换、匹配、组合及调用web服务
- 调用API的SDK相关知识:实现回调函数.
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- Twitter 向第三方开发者开放图片服务 API
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- .NET 和智能传输服务API编写自动更新程序
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- CXF之使用CXF API 发布服务与进行客户端调用
- QC远程调用QTP出现RPC服务不可用问题的解决思路
- 调用API的SDK相关知识:传递结构
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序
- 使用 .NET 和后台智能传输服务 API 来编写自动更新应用程序