反向工程遗留http api

httpreverse的Python项目详细描述


==========
HttpReverse
============



图片::https://img.shields.io/pypi/v/http reverse.svg
:目标:https://pypi.python.org/pypi/httpreverse


>帮助对传统http api进行反向工程的工具。

不同类型的
现有的、未记录的遗留http api没有遵循任何一致的、精心规划的设计。人们还认为,能够添加一点
关于这些遗留api所做工作的文档也是有帮助的。

这个包不是用来定义新api的。比如说,用招摇过市的方式。为什么不干脆用招摇过市或其他类似的工具呢?它们实际上是为了从零开始创建新的api,因此迎合了稍微不同的用例。
例如,它们倾向于面向冗长的。当逆向工程
和记录现有的api时,所有细节都不是那么重要。我们只需要简化api的使用,并且能够对它们所做的添加一个解释,而不是记录所有的事情。


这些示例希望澄清这个
包的区别和一些好处。

使用一些客户机库。
这取决于您;使用python标准库中的一些内容,或
"requests"包,或异步的一些内容,无论什么。

api规范示例
-


注意:这些示例是说明性的。有关工作示例,请参见测试。

**简单示例**


yaml中的示例api定义,指定查询
单人和双人房间预订的两个操作,分别为:

描述:检查房间预订的api

操作:

列出单人房:
标签:列出单人房预订
描述:列出所有预订的单人房

请求:
方法:获取
路径:/酒店/预订
参数:
大小:单人房

se:
类型:application/json
解析器:hotelapi.util:parseResponse


列出双人房:
标签:列出双人房预订
描述:列出所有预订的双人房


请求:
方法:get
路径:/酒店/预订选项
参数:
大小:double

响应:
类型:application/json
解析器:hotelapi.parseresponse



这类似于有多少规范语法表示http api。很清楚,
但经常会有很多样板和重复。按原样使用
pyyaml解析为普通dict。现在让我们看看如何节省一些精力。



**使用jinja模板进行api规范扩展**

api文档可以使用jinja2模板进行扩展。使用我们的房间预订示例,我们可以为每个房间大小生成一个api操作
变量::


操作:

{%对于大小为%}

list-{{size}}-房间:
标签:list{size}房间预订
描述:列出所有预订的{size}rooms
请求:
方法:get
路径:/hotel/reservations
参数:
大小:{{size}

{{%endfor%}


到一个名为"yamlsource"的字符串变量中:

>>;>;来自httpreverse import expand戡jinja
>;>;expanded=expand戡jinja(yamlsource,context={"size":["single","double"]})
>;


yaml锚/别名机制当然可以是u除了jinja模板化之外,还提供了定制的模板化机制,以方便请求和响应规范。下面是一个带有"room api"的示例
请求/响应模板,该模板用于将重复的请求和响应
规范移动到一个通用模板中,引用自实际规范::

标签:hotel api
描述:检查房间预订的api

s:

roomapi:
请求:
方法:get
路径:/酒店/预订
响应:
类型:application/json
解析器:hotelapi.parseresponse

操作:

列出单人房:
标签:列出单人房预订选项
说明:列出所有预订的单人房
模板:roomapi
请求:
参数:
大小:单人房

列出双人房:
标签:列出双人房预订
说明:列出所有预订的双人房
template:roomapi
请求:
参数:
大小:double

s"]
>;>operation=api["operations"]["list doublerooms"]
>;>applied=apply_template(operation,templates)
>;

**简单的参数化**

api定义也可以参数化,以方便运行时使用。
参数化函数接受一个可选的上下文参数,它是一个字典,用于为操作中找到的所有命名参数赋值。参数的前缀是美元符号("$")。因此
还可以为
指定一个动态调用的操作,列出房间::


操作:


列出房间:
标签:列出房间预订
描述:列出保留房间
模板:roomapi
请求:
参数:
size:$size

=api["operations"]["list rooms"]
>;>parametrized=parametrize(operation,context={"size":single}
>;


on
描述:添加房间预订模板:roomapi
请求:
方法:post
正文:
值:{"size":$roomsize,"customers":$customers}
类型:application/json

房间大小和居住者,即
`{"room size":"double","customers":["john doe","jane doe"]}`。

将自动封送至给定类型(在上面的示例中为json)。
如果直接给定参数或实体(没有类型+值语法),则必须给定默认值
,因此:

默认值:


结构化参数类型:json
结构化参数类型:json
et将指定每当遇到结构化参数
或body值(例如容器或映射)时,它将被
封送到json。简单值(字符串、数字等)按原样使用。

**请求生成器和响应解析器加载**

actions,```u load`生成器``用于加载
请求生成器,``u load`分析器``用于加载响应分析器:

>;>

**推荐的api操作规范生成和使用**

通常,当使用httpreverse时,例如使用任何http客户机发出http请求时,您可能希望首先只运行jinja扩展
,然后解析得到的yaml字符串。然后,将请求/响应
模板应用于您希望使用的操作(或者可能所有的操作)。
保留结果的副本。最后,对于每个http请求,只需参数化
正在使用的api操作,封送参数和body,然后开火!


==
history
==



>0.4.0(2017-02-26)
----


*处理任意数据结构参数化
*实现参数和正文封送
*一些向后不兼容的API更改

<0.3.0(2017-02-20)
----
*实现请求生成器加载(问题2)
*实现响应分析器加载(问题1)
*实现请求转换(问题4)


0.2.0(2017-02-19)
----


*实现静态上下文规范支持(问题3)
*改进文档umentation
*请求/响应模板扩展和规范参数化
在单个操作上发挥作用(应该这样做),而不是在完整的api上。Jinja模板扩展保持原样。

0.1.0(2017-02-17)
----


*在PYPI上首次发布。




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

推荐PyPI第三方库


热门话题
java Spring data rest域驱动设计发布非聚合根实体   使用ContentValues提升整数列的值(Java、Android)   Google应用程序引擎(Java)+Spring管理的PersistenceManager   java如何使用JDT获取封闭方法节点?   java在字符串中首先计算负数运算   java Android如何在单击按钮时更改底部导航项的颜色   java理解Javafx运行时错误   swing Java创建笔刷笔划动作   java在非Netty客户端中从Netty服务器获取响应   java计数将参数传递给方法   java Android AIDL gen文件导致警告?   swing Java JFrame互动程序   scjp测试中的java正则表达式测试   Java中的桌面应用   java我可以使用spring security在cookies中存储完整的用户信息吗?记住我   java中棘手的方法重载   java忽略Mockito中的方法调用   java skipUntil和具有并发1的flatMap挂起在Reactor中   为什么我要关闭java。util。扫描仪变量?