用于与hal+jsonapi交互的python库

restnavigator的Python项目详细描述


休息导航器
============== < BR>
构建状态覆盖状态PYPI状态文档状态| < BR>
rest navigator是一个用于与超媒体api交互的python库
(`休息水平
3<;http://martinfowler.com/articles/richardson成熟模型.html level3>;`。
现在,它只支持
`hal+json<;http://tools.ietf.org/html/draft-kelly-json-hal-05>;`但是
应该足够通用,以便最终扩展到其他格式。其
第一个目标是让与hal超媒体api的交互变得无痛
尽可能减少休息反模式。 < BR>
要安装它,只需使用pip: < BR>
代码:BASH < BR>
$pip安装restNavigator < BR>
内容
-- < BR>
-`如何使用它<;如何使用它>;。`_ < BR>
-`Links<;\Links>;。`_
-`GET REQUESTS<;GET REQUESTS>;。`_
-`Link Relation Docs<;Link Relation Docs>;。`_
-`post requests<;post requests>;。`_
-`errors<;errors>;。`_
-`Templated Links<;\Templated Links>;。`_
-`authentication<;authentication>;。`_ < BR>
-`Additional Topics<;Additional Topics>;。`_ < BR>
-`identity map<;身份映射>;。`_
-`在导航器上迭代<;在导航器上迭代>;。`_
-`headers(请求与响应)<;headers请求与响应>;。`_
-`bracket mini language<;bracket mini language>;。`_
-`查找正确的链接<;查找正确的链接>;。`_
-`default curie<;default curie>;。`_
-`指定api名称<;指定api名称>;。`_
-`Embedded documents<;Embedded documents>;。`_ < BR>
-`development<;development>;。`_ < BR>
-`testing<;testing>;。`_
-`为未来计划的<;为未来计划的>;。`_ < BR>
原始:: < BR>
<;!--结束目录-->; < BR>
如何使用
---- < BR>
要开始与hal api交互,必须创建一个halnavigator
指向api根的。理想情况下,在超媒体api中,根url
是应用程序中唯一需要硬编码的url。所有
其他url是从api响应本身获得的(想想
api客户端是"点击链接",而不是拥有url
硬编码)。 < BR>
作为示例,我们将连接到haltalk api。 < BR>
代码::python < BR>
>;>;来自RestNavigator导入导航器
>>>n=navigator.hal('http://haltalk.herokuapp.com/',默认值'u curie="ht")

halnavigator(哈尔塔克) < BR> 友情链接
~~~~~~ < BR>
通常,对于索引(通常在api根目录下),您
对链接感兴趣。让我们看看这些: < BR>
代码::python < BR>
>>>n.链接()
{u'ht:users':halnavigator(haltalk.users),
u'ht:signup':halnavigator(haltalk.signup),
u'ht:me':模板化的字符串(haltalk.users.{name}),
u'ht:latest posts':halnavigator(haltalk.posts.latest)} < BR>
(这可能需要一些时间,因为请求链接会导致
halnavigator从服务器实际请求资源)。 < BR>
在这里,我们可以看到链接是按照它们的关系类型(即
键),每个键对应一个新的halnavigator,它表示
一些其他资源。关系类型在restful中非常重要
api:我们需要它们能够确定链接在关系中的含义
以一种自动化的方式发送到当前资源。 < BR>
获取请求
~~~~~~~~~~~~ < BR>
此外,根目录还有一些与之相关的状态,您可以
有两种不同的方式: < BR>
代码::python < BR>
>;>n()资源的缓存状态(在我们查看时获得在N.Link)
{u'提示1':你需要一个帐户来发布内容..,
u'hint_2':u'create one by post via the ht:signup link..',
u'hint_3':u'单击右侧的橙色按钮以发出POST请求。',
u'hint_4':u'单击绿色按钮跟随带有get请求的链接..',
u'hint_5':u'单击书本图标阅读链接关系的文档。',
u"欢迎":u"欢迎使用haltalk服务器。"}
>>>n.fetch()将从服务器重新获取资源
{u'提示1':你需要一个帐户来发布内容..,
u'hint_2':u'create one by post via the ht:signup link..',
u'hint_3':u'单击右侧的橙色按钮以发出POST请求。',
u'hint_4':u'单击绿色按钮跟随带有get请求的链接..',
u'hint_5':u'单击书本图标阅读链接关系的文档。',
u"欢迎":u"欢迎使用haltalk服务器。"} < BR>
调用halnavigator将对资源执行get请求
并返回其值(它将缓存该值)。 < BR>
链接关系文档
~~~~~~~~~~~~~~~~~~ < BR>
让我们注册一个hal talk帐户。不幸的是,我们不知道
如何做到这一点,让我们看看文档。注册``
链接看起来很有前途,让我们检查一下: < BR>
代码::python < BR>
>>>n.docsfor('ht:signup') < BR>
浏览器将打开http://haltalk.herokuapp.com/rels/signup。 < BR> 什么?从图书馆呼叫中弹出浏览器?是的,就是这样
休息导航器滚动。我们的看法:医生是为人类服务的,
自定义rel类型是uri,不应自动取消对它们的引用
通过与api交互的程序。所以弹出浏览器服务
有两个目的: < BR>< > 1。它允许您在
需要它:当您在命令行中浪费时间试图
找出如何与api交互。
2。它提醒您不要试图自动取消引用rel
文档并在应用程序中对其进行分析。 < BR>
如果您需要更健壮的方式来浏览api和文档,
`hal browser<;https://github.com/mikekelly/hal browser>;``可能是
你最好的选择。 < BR>
发布请求
~~~~~~~~~~~~~ < BR>
"ht:signup"的文档解释post请求的格式
注册。所以让我们来报名吧。因为我们把"ht"设为
默认居里,为了方便,我们可以跳过键入居里。(注:
haltalk是一个玩具api例如,不要发送明文
真实应用程序中未加密连接上的密码!): < BR>
代码::python < BR>
>>>fred23=n['注册].创建(
…{'username':'fred23',
…密码':'hunter2',
…真名':'fred 23'}
…)

halnavigator(haltalk.users.fred23) < BR> 错误/错误 <~~~~~~~~~~ < BR>
如果用户名已经被使用,则返回400
来自haltalk api。rest\u navigator遵循python的禅
指导原则"错误不应悄无声息地传递"。一个例外
在400或500状态代码上引发。你可以压制这个例外
然后让post call返回带有400/500的"halnavigator"
状态代码(如果需要): < BR>
代码::python < BR>
>>>重复注册=n['ht:signup'].创建({
…用户名':'fred23',
…密码':'hunter2',
…真名:"弗雷德·威尔逊"
…},raise_exc=false)
>>>重复注册
孤儿导航器(haltalk.signup)400!
>>>重复注册状态
(400,"错误请求")
>>>重复注册状态
{u"errors":{u"username":[u"已被接受"]} < BR>< BR/>嵌入链接
~~~~~~~~~~~~~~~ < BR>
现在我们已经注册了,让我们看看我们的个人资料。链接为
用户配置文件是一个模板链接,restNavigator表示为
一个"部分导航器"。类似于python的
`functools.partial<;https://docs.python.org/2/library/functools.html functools.partial>;`,
"partialnavigator"是一个需要更多参数的对象
给你一个完整的导航器。尽管它的名字,它不能和
网络本身。它的工作是为您生成新的导航器。你
通过查看其`.variables``属性,可以看到它有哪些变量
(它的"代表"也暗示了这一点): < BR>
代码::python < BR>
>>>n.links().keys()
['ht:latest posts'、'ht:me'、'ht:users'、'ht:signup']
>;>n['ht:me']
部分导航器(haltalk.users.{name})
>>n['ht:me'].变量
设置(['name']) < BR>
"ht:me"rel类型的文档应该告诉我们
参数应该可以工作,但在这种情况下,它相当明显
(插入用户名)。两个提供模板参数,只需调用
带有关键字参数: < BR>
代码::python < BR>
>>>部分时间=n['ht:me']
>>>部分模板
"http://haltalk.herokuapp.com/users/{name}"
>;>;fred=部分(name='fred23')
>>>弗雷德
halnavigator('haltalk.users.fred23') < BR>
现在我们有了一个真正的导航器,可以获取资源: < BR>
代码::python < BR>
>;>gt;弗雷德()
{u"bio":无,u"实名":u"fred wilson",u"用户名":u"fred23"} < BR>
身份验证
~~~~~~~~~~~~~~ < BR>
为了向haltalk发布一些内容,我们需要向
新创建的帐户。halnavigator允许任何"身份验证方法"
要求
支持<;http://www.python-requests.org/en/latest/user/advanced/自定义身份验证>;。`_
(例如oauth等)。对于基本身份验证(haltalk使用),我们可以通过 TBR/>元组。 < BR>
代码::python < BR>
>;>>n.验证(("fred23","hunter2"))所有后续调用均已验证 < BR>
这不会向服务器发送任何内容,它只是设置
我们将在下次请求时使用的身份验证详细信息。其他
身份验证方法可能会立即与服务器联系。 < BR>
现在我们可以将所有内容组合在一起,创建一个新的帖子: < BR>
代码::python < BR>
>;>;n戋post=n['me'](name='fred23')['posts'].create({'content':'my first post'})

halnavigator(haltalk.posts.523670eff0e637002000001)
>>>n_post()
{内容':'我的第一篇文章','创建时间':'2015-06-13t19:38:59+00:00'} < BR>
在创建
一个新的导航器。 < BR>
例如,如果要与受oauth2保护的api交谈,只需传递
将用于所有请求的OAuth2会话对象
由HalNavigator完成: < BR>
代码::python < BR>
>>>>来自请求的
>;>;oauth2_session=oauth2session(r'client_id',token='token')
>>>n=navigator.hal('https://api.example.com',session=oauth2_session) < BR>
其他主题
---- < BR>
身份图
~~~~~~~~~~~~ < BR>
你不必担心不经意间会有两个不同的
指向同一资源的导航器。rest\u navigator将重用
现有的导航器,而不是创建新的导航器 < BR>
在导航器上迭代
~~~~~~~~~~~~~~~~~~~~~~~~~~ < BR>
如果资源与rel"next"有链接,则该资源的导航器
资源可以用作python迭代器。它将自动依利提出
如果链中的资源没有下一个 链接。这使得浏览页面资源变得非常简单
蟒蛇: < BR>
代码::python < BR>
post_navigator=fred['ht:posts']
对于post_navigator中的post:
第一篇文章将是post-navigator本身
打印(post.state) < BR>
标题(请求与响应)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ < BR>
http响应头在"n.response.headers"中可用`` < BR>
可以通过
会话: < BR>
代码::python < BR>
>>>n.会话标题
饼干等 < BR>
括号迷你语言
~~~~~~~~~~~~~~~~~~~~~ < BR>
导航器上的括号(`[]`)运算符有很大的功能。正如我们
如前所述,主要用途是从链接获取新的导航器
关系: < BR>
代码::python < BR>
>>n2=n['居里:链接' < BR>
但是,它也可以深入到多个链接,相当于
在一行中使用多个括号: < BR>
代码::python < BR>
>;gt;n3=n['居里:第一个链接','居里:第二个链接']
相当于:
n3=n["居里:第一个链接"]["居里:第二个链接"] < BR>
当然,如果设置了默认居里,则可以忽略它: < BR>
代码::python < BR>
>;gt;n3=n['第一个链接','第二个链接'] < BR>
在内部,这完全等同于重复应用
括号运算符,因此您甚至可以使用它跳过中间值
本身不是导航器的对象: < BR>
代码::python < BR>
>;gt;n["某些链接",3,"其他链接"] < BR>
这将使用"some link"链接关系,选择第三个链接
从列表中,然后在该资源的"另一个链接"后面。 < BR>
找到正确的链接
~~~~~~~~~~~~~~~~~~~~~~ < BR>
通常,可以将括号连在一起,从一个资源跳到
一气呵成: < BR>
代码::python < BR>
>;>n['ht:widget']['ht:gadget'] < BR>
这将返回"ht:widget"链接关系的导航器,并且
然后立即获取资源并返回
``ht:gadget``链接关系。如果你只有一个链接,这就很好了
每个关系,但是hal允许每个关系有多个链接。说
实例我们有如下链接: < BR>
代码::javascript{ < BR>
"ht:一些相关:[
{
"ref":"/api/widget/1",
"name":"widget1",
"配置文件":"小部件"
},
{
"ref":"/api/widget/2",
"name":"widget2",
"配置文件":"小部件"
},
{
"ref":"/api/gadget/1",
"name":"小工具1",
"配置文件":"小工具"
}
< BR>
当我们去获取"ht:some_rel"时,会得到多个结果: < BR>
代码::python < BR>

[halnavigator(api.widget[1]),
halnavigator(api.widget[2]),
halnavigator(api.gadget[1])] < BR>
我们怎么知道我们想要哪一个?哈尔
规范<;https://tools.ietf.org/html/draft-kelly-json-hal-06第5.5节>;。`_
表示具有相同rel的链接可以通过"name"链接消除歧义
属性: < BR>
代码::python < BR>
>;>;n.链接['ht:some_rel'].get_by('name','gadget1')
halnavigator(api.gadget[1])
>;>;n.链接['ht:some'u rel']。命名为('gadget1')与上一个相同
halnavigator(api.gadget[1]) < BR>
我们还可以使用其他属性对列表进行切片和分块: < BR>
代码::python < BR>
>>>n.链接['ht:some_rel'].get_by('profile"小玩意儿"
halnavigator(api.gadget[1])
>;>;n.链接['ht:some_rel'].getall_by('profile','widget')
[halnavigator(api.widget[1]),halnavigator(api.widget[2])] < BR>
这适用于链接上的任何属性,而不仅仅是标准的hal
属性。 < BR>
默认居里
~~~~~~~~~~~~~ < BR>
创建导航器时,可以指定默认居里: < BR>
代码::python < BR>
>;>n=halnavigator('http://haltalk.herokuapp.com',curie='ht') < BR>
现在,当您跟踪链接时,如果您 希望: < BR>
代码::python < BR>
>>>n.链接
{'ht:users':[halnavigator(haltalk.users)],
"ht:signup":[halnavigator(haltalk.signup)],
'ht:me':[halnavigator(haltalk.users.{name}],
"ht:最新帖子":[halnavigator(haltalk.posts.latest)]

>>>n['ht:用户]
halnavigator(haltalk.用户)
>>>n["用户"]
halnavigator(haltalk.用户) < BR>
唯一的例外是提供的密钥是注册的 链接/链接
关系<;http://www.iana.org/assignments/link relations/link relations.xhtml>;`,
并且存在冲突(提示:这应该非常罕见): < BR>
代码::python < BR>
>>>n.链接
{'ht:next':halnavigator(haltalk.unregistered),下一步:
"下一步":halnavigator(haltalk.registered)}
>>>n["下一步"]
halnavigator(已注册haltalk) < BR>
指定api名称
~~~~~~~~~~~~~~~~~~~~~~ < BR>
有时自动api命名的猜测很糟糕。如果你愿意
覆盖默认名称,可以在创建
导航器: < BR>
代码::python < BR>
>;>;n=navigator.hal('http://api.example.com',apiname='myspecialapi')
halnavigator(myspecialapi) < BR>
嵌入式文档
~~~~~~~~~~~~~~~~~~ < BR>
在rest\u navigator中,嵌入的文档被透明地处理。这个
意味着在许多情况下,您不必担心
文档已嵌入或已链接。 < BR>
例如,假设我们有如下资源: < BR>
代码:JSON < BR>
{
"链接":{

"xx:yams":{
"ref":"/山药"
}

},
"嵌入":{
"xx:泡菜":{
"链接":{
"self":{"ref":"/pickles"}
},
"state":"泡菜"
}


< BR>
从这里,您可以同时访问"山药"和"泡菜"``
具有普通括号语法的资源: < BR>
代码::python < BR>
>;>>山药=n['xx:yams']
>;>pickles=n['xx:pickles'] < BR>
这里唯一的区别是"yams"还没有取出来,而
"pickles"已经被视为"已解决",因为我们将其作为
嵌入式文档。 < BR>
: < BR>
>>>已解决的山药
错误
>;>>山药州无
>;>>泡菜解决。
正确
>>>泡菜状态
{'状态':'泡菜'} < BR>
如果嵌入式文档具有自链接,您可以像对待自己一样对待它
任何其他资源。所以如果你想刷新资源
简单到: < BR>
代码::python < BR>
>>gt;pickles.fetch() < BR>
这将从
自链接,即使您以前从未直接请求过该uri。如果
嵌入式资源没有自链接,它将是
``orphannavigator``父级设置为嵌入的资源 英寸 < BR>
当然,如果需要直接区分链接资源
和嵌入式资源,有一个输出: < BR>
代码::python < BR>
>>>n.嵌入式()
{'xx:pickles':halnavigator(api.pickles)
>>>n.链接()
{'xx:yams':halnavigator(api.yams) < BR>
但是,当使用"in"运算符时,它将在两者中查找键
您感兴趣的是: < BR>
代码::python < BR>
>;>;>;'yams'在n默认居里是考虑在内的!
正确
>>>'xx:n中的山药
正确
>>gt;'xx:泡菜'in n
正确 < BR>
开发
----- < BR> BR/>测试 < >< BR>
要运行测试,首先安装'pytest
框架<;http://pytest.org/latest/getting started.html>;`\ < BR>
: < BR>
$pip安装-u pytest < BR>
要运行测试,请从源目录的根目录执行以下操作: < BR>
: < BR>
$py.测试 < BR>
为未来规划
~~~~~~~~~~~~~~~~~~~~~~ < BR>
-能够为不同类型、rel和profile添加钩子。如果A
link具有这些属性之一,当执行
服务器调用。
-因为hal没有指定发布、放置和修补的内容类型
需要时,您可以根据服务器将
接受。这可以触发rel类型的链接,或者rest
导航器可以通过http与服务器进行内容协商
直接查看资源将接受的内容类型。 < BR>
贡献者
~~~~~~~~~~~~ < BR>
非常感谢rest navigator的贡献者: < BR>
-`dudycooly<;http://github.com/dudycooly>;。`_
-`bubenkoff<;http://github.com/bubenkoff>;。`_
-`bbsgfalconer<;http://github.com/bbsgfalconer>;。`_ < BR>
|构建状态图像::https://img.shields.io/travis/deontologician/restnavigator/next.svg
:目标:https://travis-ci.org/deontologician/restnavigator
|覆盖状态图像::https://img.shields.io/coveralls/deontologician/rest_navigator/next.svg
:目标:https://coveralls.io/r/deontologician/rest_navigator?分支=下一个
|文档状态图像::https://readthedocs.org/projects/rest-navigator/badge/?版本=最新
:目标:https://readthedocs.org/projects/rest-navigator/?徽章=最新
:alt:文档状态
| Pypi状态图像::https://pypip.in/v/restnavigator/badge.png
:目标:https://crate.io/packages/restNavigator/ < BR>< BR>
更改日志
========= < BR>
未发行
---- < BR>
-TBD < BR>
1 < BR>< BR>
-嵌入式支持
-指定默认居里的能力
-没有url的资源现在由一种称为孤立导航器的特殊导航器类型表示
-url中可以使用ip地址(@dudycooly)
-所有测试都在python 2.6-gt;3.4(@bubenkoff)中通过,travis现在运行tox以确保它们保持不变
-支持delete和patch方法
-帖子允许空正文(@bbsgfalconer)
-大大改进了内容协商(@bbsgfalconer)
-还有一个主要的重构,它改变了导航器的创建方式和内部清理
很多非常混乱的代码。

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

推荐PyPI第三方库


热门话题
java使用jackson序列化/反序列化具有不同属性的子属性   javascript驱动程序。getTitle()从错误页面获取数据   java web应用程序的增量部署   java字符引用“&#x10”是无效的XML字符   java MyEclipse+Hibernate不按ID排序属性集?   找不到IBM Filenet P8更改预处理器Java实现   java比较器,用于按浮点参数对对象arraylist排序   java如何调试。来自eclipse或其他版本的bsh文件   不允许使用java rest api post方法   java如何在Servlet中打开弹出窗口,然后重定向页面   java的replaceAll方法对我不起作用我做错了什么?   我收到了javax。网ssl。SSLHandshakeException:握手期间远程主机关闭连接