6个稳定版本
使用旧Rust 2015
2.1.1 | 2023年4月27日 |
---|---|
2.1.0 | 2020年5月28日 |
2.0.1 | 2020年4月14日 |
2.0.0 | 2020年3月20日 |
1.0.0 | 2018年10月13日 |
#106 在 HTTP服务器
668 每月下载量
在 3 crates 中使用
66KB
1K SLoC
HTTP测试服务器
程序化创建端点,监听连接并返回预定义响应。
- 支持多个端点和同时的客户端连接
- 流式支持
- 辅助函数,用于检索数据,如请求数量、连接客户端数量和请求元数据
- 自动分配空闲端口,并在使用后关闭服务器
示例
接受POST请求
extern crate http_test_server;
use http_test_server::{TestServer, Resource};
use http_test_server::http::{Status, Method};
let server = TestServer::new().unwrap();
let resource = server.create_resource("/some-endpoint/new");
resource
.status(Status::Created)
.method(Method::POST)
.header("Content-Type", "application/json")
.header("Cache-Control", "no-cache")
.body("{ \"message\": \"this is a message\" }");
// request: POST /some-endpoint/new
// HTTP/1.1 201 Created\r\n
// Content-Type: application/json\r\n
// Cache-Control: no-cache\r\n
// \r\n
// { "message": "this is a message" }
使用路径和查询参数
extern crate http_test_server;
use http_test_server::{TestServer, Resource};
use http_test_server::http::{Status, Method};
let server = TestServer::new().unwrap();
let resource = server.create_resource("/user/{userId}?filter=*");
resource
.status(Status::OK)
.header("Content-Type", "application/json")
.header("Cache-Control", "no-cache")
.body(r#"{ "id": "{path.userId}", "filter": "{query.filter}" }"#);
// request: GET /user/abc123?filter=all
// HTTP/1.1 200 Ok\r\n
// Content-Type: application/json\r\n
// Cache-Control: no-cache\r\n
// \r\n
// { "id": "abc123", "filter": "all" }
公开持久流
let server = TestServer::new().unwrap();
let resource = server.create_resource("/sub");
resource
.header("Content-Type", "text/event-stream")
.header("Cache-Control", "no-cache")
.stream()
.body(": initial data");
// ...
resource
.send("some data")
.send(" some extra data\n")
.send_line("some extra data with line break")
.close_open_connections();
// request: GET /sub
// HTTP/1.1 200 Ok\r\n
// Content-Type: text/event-stream\r\n
// Cache-Control: no-cache\r\n
// \r\n
// : initial data
// some data some extra data\n
// some extra data with line break\n
重定向
let server = TestServer::new().unwrap();
let resource_redirect = server.create_resource("/original");
let resource_target = server.create_resource("/new");
resource_redirect
.status(Status::SeeOther)
.header("Location", "/new" );
resource_target.body("Hi!");
// request: GET /original
// HTTP/1.1 303 See Other\r\n
// Location: /new\r\n
// \r\n
正则表达式URI
let server = TestServer::new().unwrap();
let resource = server.create_resource("/hello/[0-9]/[A-z]/.*");
// request: GET /hello/8/b/doesntmatter-hehe
// HTTP/1.1 200 Ok\r\n
// \r\n
查看 /tests/integration_test.rs 获取更多使用示例。
注意:这并不是一个功能齐全的服务器。因此,许多验证和行为都没有实现。例如:带有不支持 Content-Type
的 Accept
标头的请求不会触发 406 不接受
。
由于这个crate是为了在测试中使用而设计的,因此智能行为可能会令人困惑和误导。话虽如此,为了方便起见,实现了一些默认行为
- 服务器在请求未配置的资源时返回
404 未找到
。 - 当尝试使用与配置不同的方法访问资源时,服务器返回
405 方法不允许
。 - 默认情况下,当创建资源时,它将响应
GET
并返回200 Ok
。
许可证
许可协议为以下之一
- Apache许可证第2版 (LICENSE-APACHE)
- MIT许可证 (LICENSE-MIT)
任选其一。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交的、旨在包含在工作中的任何贡献,应按上述方式双重授权,无需附加条款或条件。
依赖项
约2-3MB
约53K SLoC