非常简单的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/dependencyget) 将引发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如果你喜欢这个!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java接口中的每个方法都是抽象的,但在抽象类中,我们也只能使用抽象方法   初始化Java中声明的、未初始化的变量会发生什么情况?   java BouncyCastle openPGP将字节[]数组加密为csv文件   在Java中将类A(和所有子类)映射到类B的实例的字典   RSA公钥编码,在Java和Android中,代码相同,结果不同   java在安卓中实现数字检测语音识别   java取消选择复选框   java如何在其他配置中重用Maven配置XML片段   java有没有一种有效的方法来检查HashMap是否包含映射到相同值的键?   spring处理程序调度失败;嵌套的例外是java。lang.NoClassDefFoundError:org/apache/http/client/HttpClient   带有ehcache的java多层缓存   java如何访问chromium(或任何其他浏览器)cookie   java通过将两个集合与spring data mongodb data中的条件合并来获取计数   安卓中R.java的语法错误