upscale / http-server-mock
响应已识别请求的静态正文和头部的HTTP服务器
Requires
- php: >=5.6.0
- ext-dom: *
- ext-json: *
- ext-libxml: *
- zendframework/zend-diactoros: ~1.3
Requires (Dev)
- phpunit/phpunit: ~4.0
README
本项目实现了一个HTTP服务器,该服务器响应已识别的请求,返回静态正文和头部。请求的任何部分,包括头部,都可以配置以影响返回的响应。请求与响应之间的映射在JSON配置文件中声明。
虽然是一个通用服务器,但该项目特别适用于REST API。它可以在几分钟内启动一个完全可操作的模拟API服务器,用于原型设计。
功能
- 通过方法、URL、头部、正文匹配请求
- 使用静态头部和正文响应
- 请求/响应正文在外部文件中
- JSON配置文件
安装
通过Composer将项目安装到您选择的目录
composer create-project --no-dev upscale/http-server-mock /tmp/http-server-mock
使用方法
启动服务器最简单的方法是通过PHP的内置Web服务器
php -S 127.0.0.1:8080 /tmp/http-server-mock/server.php
在浏览器中打开 http://127.0.0.1:8080 以确认服务器正在运行。
或者,使用已安装Apache 2.x和mod_rewrite的HTTP服务器。该项目已预配置,可以部署在任何Document Root下以开始服务传入请求。
配置
配置定义了通过其属性匹配响应到请求的规则,格式为JSON。
服务器在以下位置查找配置文件
- 环境变量中的文件名
HTTP_SERVER_MOCK_CONFIG_FILE
- 项目根目录中的文件
config.json
- 提供的文件
config.json.dist
格式
JSON配置文件具有以下格式
[ { "request": { "method": "POST", "path": "/blog/posts", "params": {}, "headers": {"Accept": "application/json", "Content-Type": "application/json"}, "cookies": {}, "body": "{\"title\":\"Hello World!\",\"body\":\"This is my first post!\"}" }, "response": { "status": 201, "reason": "Created", "headers": {"Content-Type": "application/json"}, "body": "{\"id\":\"1\",\"title\":\"Hello World!\",\"body\":\"This is my first post!\"}" } } ]
大多数属性都是标量。属性 params
、headers
、cookies
是键值对。
几乎所有属性都是可选的,可以省略以不参与匹配。
外部源
在上面的配置示例中,请求和响应正文都嵌入到配置文件中。虽然在某些情况下很有用,但它可能会使文件膨胀并创建额外的格式化挑战,例如转义。
配置支持对外部源的引用,例如
{ "body": "file://%base_dir%/data/blog/posts/1/response.json" }
占位符 %base_dir%
表示服务器安装目录的绝对路径。
请求格式
服务器在匹配请求时考虑请求正文的格式。可读性强的格式允许在语法上有一定程度的自由度,以提高内容可读性。大多数格式通常允许空格和缩进的变化。无论使用哪种语法变化,请求正文都会成功匹配。
格式由请求头 Content-Type
自动确定。常见的MIME类型到支持的格式的映射在 mime-types.php
中声明。如果自动检测不足,可以在配置中强制执行格式。
强制执行正文格式的配置语法
{ "request": { "format": "json" } }
支持格式:binary
、text
、xml
、html
、json
。
默认情况下假设格式 binary
。
响应延迟
真实服务器计算响应所需时间因请求而异,差异很大。出于测试目的,可能需要模拟重型操作的实时响应时间。
该配置允许指定固定的响应延迟,例如
{ "response": { "delay": 2000 } }
延迟持续时间以毫秒为单位(1秒=1000毫秒)。
算法
对于每个传入请求,服务器从配置文件中读取规则并评估它们。规则将按照声明的顺序逐个与请求进行评估,直到找到第一个匹配项。一旦成功匹配,将返回匹配规则的响应,并且后续处理停止。
规则评估是通过检查传入请求是否具有声明的请求属性来完成的。为了匹配,请求需要包含所有声明的属性的匹配值。对于键值属性,需要所有声明的对都存在。允许存在配置中未提到的附加数据。
注意:具有特定属性的规则需要位于具有相同属性子集的通用规则之前。否则,通用规则将在特定规则评估之前匹配,从而有效地抑制后者。
贡献
欢迎提交包含修复和改进的拉取请求!
许可证
版权所有 © Upscale Software。保留所有权利。
许可协议:Apache License, Version 2.0,详情请见此处。