Beckett:一个Python的HTTP API客户端
Beckett:一个Python的HTTPAPI客户端,我正在发布一个新的开源项目。
Beckett是一个基于惯例的(convention-based)框架,是为了建设HTTPAPIs的Python接口。
这是我做的第一个正式的框架项目,也是这两年内我发布的第一个项目。那时我已经学会了很多关于如何构建稳健和可持续的代码,所以,最好的尝试就是创造一些有用的东西。
如果你想直接进入正题,可以直接读documentation,但是如果你想了解更多,那么就继续读下去。
目标
Beckett的目的是解决那些我在尝试集成API服务和其他的项目时遇到的问题。
我创建PokéAPI和SWAPI来提供免费的教育性质的API,我也看见了学生使用时常见的问题。此外,我在Lyst所从事的服务架构和“微服务”的工作,集成也是必要的。
这让我创建了Beckett。但是在我们探讨它是做什么的之前,让我们讨论一下我曾遇到的问题。
集成API服务遇到的问题
处理JSON对象
集成API服务是一种趋势,集成以后可以仅从它的服务器的响应中获取原始的JSON对象。但是当你处理从不同的服务器获取的很多不同的响应时,这就会成为一个问题,你需要弄清楚什么是什么。
这是一个人吗?这是一个物品吗?在这里,类型检查将不再有帮助,因为它们的类型都一样,都是字典类型!当开发者决定她可以查看JSON对象来确定它是什么时,这更是一个问题。你的资源拥有类似的属性。
自己重复
我发现,当人们在HTTP实践中做的更好时,他们的URI和集成也开始变得更一致。也因为如此,集成的大部分工作就是复制/粘贴。尤其是当涉及到URI的结构和方法。
比如说,在Lyst上面,我们的一个API拥有的资源分别叫做Products和Designers,这些资源的URL结构类似于下面这样:
我们用于和它们交互的客户端具有这些Python方法:
这些方法基本上做一样的事情,但是我们把每个都单独写出来。建立在这个惯例(convention)之上,将更实用,更富有成效,。
然而,除了我们都使用的惯例(convention),很多API依然具有特定领域的特征,此时,基于惯例的方法将不再有用。一个API可能具有这样的URL结构:
在这里,典型的惯例是帮助不了我们的,但是,那并不意味着在生产力方面使用惯例的帮助是没有用的。
集成超媒体
我曾经写过超媒体和它的实用性(链接:writtenabouthypermedia),但我在实践中很少见到它。这是API服务最令人兴奋的并且被完全忽略的特征。我认为在我们的APIs客户端上,应该合理的使用它。
串行化语言不灵活
我尝试使用的所有的客户端框架经常使用yaml,JSON,或其他专用的串行化语言定义自身,他们不支持用户定制,一点都不灵活。
Beckett是什么
头脑中有这些问题,和足够的写和重写创建API集成工具的经验,我开始写一个项目,它后来就成为现在的Beckett。
如我前面提到的,Beckett是一个基于惯例(convention-based)的框架,是为了建设HTTPAPIs的Python接口。
因为它是基于惯例的,它不需要使用魔法就能用语HTTPAPIs,像REST风格的URI和资源一样。
资源被声明为Python类,像这样:
然后你用客户端获取你要的资源并进行记录:
就是这样,这就是你需要做的所有事。
Beckett会在客户端使用reflection产生python方法,用于与注册资源交互:
这些方法产生URI结构来匹配restful风格的URIs:
客户端的响应是资源类的类型实例,所有你定义的属性将从JSON响应中提取,并作为属性添加在实例中:
灵活性
因为过并不是所有的API都是一样的,Beckett被设计得很灵活,允许你修改它工作方式的各个方面:
URI生成
分页响应渲染
请求头和请求会话
安全认证
举个例子,如果你需要修改我们的产品资源使其与我前面提到的唯一的URI协同工作,我们可以子类化我们资源中的get_url方法
这个方法利用了继承的优势,从而比串行化语言能够提供更多的灵活性。
超媒体
Beckett能够理解超媒体,并帮助你遍历API的相关资源。如果我们的Product资源和Designers有关,我们可以在我们的代码中使用HypermediaResource基类进行声明,它将检查和理解超媒体链接:
Beckett将检查JSON响应数据,为Designer资源匹配URL模式,并生成和它交互的方法:
这是一个非常强大的特性,我对此很高兴,因为我希望它能够帮助更多的客户端框架采用超媒体
谁正在使用Beckett
如果没有途径测试它,我就不可能发布它。Beckett正在为PokéAPI和SWAPI的Python用户提供支持。它也已经在Lyst上测试过了,为我们最繁忙的API服务提供集成。这个内部API一天之内有超过十万次的请求,并在最初的几个版本的Beckett中帮助修复了一些bug。
未来的计划
我现在的计划是把Beckett一直作为一个开源的项目。我想它可以作为一个很好的例子,可以提供API客户端是怎样集成的,尤其是与超媒体概念协同工作的那些。
目前Beckett可以对HTTP请求以及它所处理的HTTP响应对象提供灵活的控制。我想在未来提供更多的灵活性,但要做到这一点,我需要更多的特定领域的用例。
最后。我希望你可以下载它并尝试把它集成到你的项目中,然后给我提供一些如何改进它的反馈。
名字是哪里来的
Beckett这个名字来源于Dr.SamBeckett,是时空怪客(Quantumleap)的主角的名字。他穿越时间,栖居于别人的身体里面,解决他们的问题,然后在另一个时间移到另一个人的身体里。这是一种我想象的框架的运作方式:它变成你的API,解决你的问题。Beckett也是一个著名的先锋派小说家的名字,这很酷。
有任何问题,都可以在下面提问,或着在twitter上联系我。
Python培训、Python培训班、Python培训机构,就选光环大数据!
还不够过瘾?想学习更多?点击 http://hadoop.aura.cn/python/ 进行Python学习!
大数据培训、人工智能培训、Python培训、大数据培训机构、大数据培训班、数据分析培训、大数据可视化培训,就选光环大数据!光环大数据,聘请专业的大数据领域知名讲师,确保教学的整体质量与教学水准。讲师团及时掌握时代潮流技术,将前沿技能融入教学中,确保学生所学知识顺应时代所需。通过深入浅出、通俗易懂的教学方式,指导学生更快的掌握技能知识,成就上万个高薪就业学子。 更多问题咨询,欢迎点击------>>>>在线客服!