反向工程遗留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上首次发布。
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定义,指定查询
单人和双人房间预订的两个操作,分别为:
操作:
列出单人房:
标签:列出单人房预订
描述:列出所有预订的单人房
请求:
方法:获取
路径:/酒店/预订
参数:
大小:单人房
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上首次发布。