动态rest客户端
restdyn的Python项目详细描述
restdyn是在优秀的restkit库之上构建的动态rest客户机。
它的目标是能够处理任何api的uri。
它是怎么工作的?
假设我们想要获取伟大服务http://www.example.com的json api。他们的api来自http://api.example.com/1.0/:
>>> from restdyn import Client >>> ExampleAPI = Client('http://api.example.com/1.0/')
现在我们要从http://api.example.com/1.0/users/search?q=Timy:
>>> results = ExampleAPI.users.search(q='Timy')
就这样!results是一个json对象。
进一步
自动添加参数
有时候有些api有点棘手。以前,api的版本是资源的一部分,但是如果我们必须为每个请求指定它,该怎么办:
http://api.example.com/user/search?v=1.0&q=Timy
我们可以指定一个或多个参数,这些参数将自动添加到查询中:
>>> ExampleAPI = Client('http://api.example.com') >>> ExampleAPI.set_persistent_params(v="1.0")
或者你可以传一个指令:
>>> ExampleAPI.set_persistent_params({'v':'1.0'})
自定义资源
一些api,比如twitter,在资源之后、查询之前添加.json:https://api.twitter.com/1/search.json&q=Timy。我们可以这样做:
>>> TwitterAPI = Client('https://api.twitter.com/1', end_resource='.json') >>> results = TwitterAPI.search(q='Timy')
后处理结果
有时你可能要在把结果送回去之前把它清理干净。您可以通过重载client.post_process_result方法来实现。
示例:
Google’s web service won’t send an http error 400 if the request failed. Instead, it will send a custom result:
http://ajax.googleapis.com/ajax/services/search/web?q=Earth%20Day
将发送回来:
{"responseData": null, "responseDetails": "invalid version", "responseStatus": 400}
假设我们希望捕获错误并引发一个requestFailed异常,该异常带有一条自定义消息,该消息位于“responseDetails”字段中:
class CustomGoogleAPI(Client): def post_process_result(self, result): if result["responseStatus"] == 400: raise RequestFailed(result['responseDetails']) return result
就这样!不要忘记在post_process_result方法结束时返回结果。
>>> GoogleAPI = CustomGoogleAPI('http://ajax.googleapis.com/ajax/services') >>> GoogleAPI.search.web(q="toto") Traceback (most recent call last): ... RequestFailed: invalid version
添加尾随斜杠
如果正在处理的api的所有url中都有斜线,则可以配置restdyn来添加它:
>>> example_api = Client('http://api.example.com', add_trailing_slash=True)