非常简单的rest客户端框架
simple_rest的Python项目详细描述
这是一个构建rest客户机的简单库。它应该允许在没有 过度工程化。
示例
让我们建立一个简单的客户机。最复杂的部分是写下api规范。 假设我们通过基于chronos的字典定义了一个api,以帮助满足其web界面的特殊需求
{ 'scheduler': { 'endpoints': { 'jobs': { 'methods': { 'get': [200] } }, 'job': { 'endpoints': { '$job': { 'methods': { 'delete': [ 204 ], 'put': [ 204 ] } } } }, 'task': { 'endpoints': { 'kill': { 'endpoints': { '$task': { 'methods': { 'delete': [ 204 ] } } } } } }, 'dependency': { 'methods': { 'post': [ 204 ] } }, 'iso8601': { 'methods': { 'post': [ 204 ] } } } } }
太棒了!现在让我们使用它
>>> api_definition = { ... } # our dictionary >>> from simple_rest import API, Client >>> chronos_api = API(**api_definition) >>> chronos_client = Client(host, chronos_api)
调用端点,如scheduler/jobs
>>> chronos_client.api.scheduler.jobs.get()
现在将请求
>>> '%s/%s' % (host, 'scheduler/jobs') https://10.0.2.121:4400/scheduler/jobs
因为一些奇怪的猴子修补。查看tipp的测试模块,了解如何测试应用程序中的请求。 测试实现有点可怕,但你会明白的。
请求的返回对象是默认的requests.model.response。由于rest实现的不同 我认为应该由用户来决定如何处理响应。
此外,您可能已经注意到,例如,其中标记为“$job”的作业端点。这个符号可以用来 允许变量终结点。在我们的例子中,这可能是一个工作ID或名称
>>> baked_endpoint = chronos_client.api.scheduler.job.job('my_job') >>> baked_endpoint.get()
请求将转到
https://10.0.2.121:4400/scheduler/job/my_job
一些异常行为是预定义的。端点规范中未给出的响应状态代码将导致 在requestStatusException和对http请求方法的调用中(例如,对端点scheduler/dependency的get) 将引发forbiddenrequestexception。虽然我认为他们有必要使错误更加明显,但我不是 对他们百分百满意。
现在只剩下为我们新创建的api编写一个抽象层了
>>> import json >>> class Chronos(Client): ... def __init__(self, host): ... super(Chronos, self).__init__(host, chronos_api) ... ... def list_jobs(self): ... return self.api.scheduler.jobs().json()
当然,虽然这是一种有效的方法,但我建议将其打包成一个整洁的小模型。看看我的 其他项目simple_model如果你喜欢这个!