反向工程遗留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持久性和Foxpro   javajavax。命名。NameNotFoundException:com。javacodegeeks。实例服务AccountServiceRemote   java在不重复字符的情况下查找最长子字符串的长度   控制台Java runtine。执行官:不会改变路径   Java继承混乱,超类和子类成员变量同名   循环如何格式化在Java中循环的打印行   使用Jersey/Glassfish实现java正确的CDI注释   多线程Java创建一个连续线程数组   java根据特殊字符(逗号除外)验证字符串   安卓 JNI NewStringUTF调用了挂起的异常“java”。lang.NoSuchMethodError'   java在JSweet转换后运行脚本   java为什么$MockitoMock$实例没有被标识为mock?   用JavaJNA编写的密钥侦听器。无法停止线程   从Java代码创建的安卓视图包装在另一个视图中。为什么?   在另一个类中使用带有逻辑的JavaSwingGUI   java致命异常:Timer0?   java JavaFX在tableview中移动列   spring将jboss 6.0.0上的Hibernate 3.6升级为Hibernate 4.3.6,以获取java。lang.NoClassDefFoundError:org/hibernate/classic/Session   ImageView中的java图像是拉伸的   java我想扩展枚举和对象(通用)