动手造轮子 —— dotnet-HTTPie
Intro
HTTPie 是一个基于 Python 的 HTTP CLI 工具,这也意味着想用 HTTPie 就需要安装 Python 环境,不想装 Python 环境,于是想用 C# 也写一个类似的东西,HTTPie 的语法很简单、简洁而且功能强大,基本可以完全取代 cURL,最近写了一个类似的工具 dotnet-HTTPie,遵循着 HTTPie 的语法,HTTPie 怎么用使用 dotnet-HTTPie 基本也是一样的,简化 API 的测试
安装
dotnet-HTTPie 是一个 dotnet tool,所以你可以按照 dotnet tool 的安装方式来进行安装
使用下面的命令来安装最新的稳定版 dotnet-HTTPie
dotnet tool install --global dotnet-httpie
如果想要使用最新的预览版,可以使用下面的命令:
dotnet tool install --global dotnet-httpie --version *-*
使用指南
语法如下:
http [flags] [Method] URL [item [item]]
常用的 HTTP Method 都是支持的 OPTIONS
/HEAD
/GET
/POST
/PUT
/DELETE
/PATCH
都是支持的
item 支持三种:
类型 | 语法 |
---|---|
QueryString | name== test |
Header | X-Api-Key: test |
Request-Data | name= test, raw data field example(Only effective for JSON): age:= 10, job:= '{"Id":1,"Name":"test"}'(Escape needed for Windows) |
Sample1:
http -v https://reservation.weihanli.xyz/health
output:
GET /health HTTP/1.1
Host: reservation.weihanli.xyz
Schema: https
Content-Type: application/json;charset=utf-8
User-Agent: dotnet-HTTPie/0.1.0HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 03 Aug 2021 14:40:00 GMT
Server: nginx/1.14.1
Transfer-Encoding: chunkedhealthy
不指定 HTTP Method 并且没有 Request Data 的时候默认方法是
GET
-v
代表--verbose
要输出所有的请求和响应信息,包括请求头、请求body、响应头和响应body,默认地只输出响应头和响应消息体,你也可以通过 --print 来更精确的控制输出选项,例如只打印请求和响应头信息可以用:--print=HhH:request headers, B:request body,
h:response headers, b:response body
Sample2:
http -v https://reservation.weihanli.xyz/health hello==world Api-Version:2.0 name=XiaoMing age:=10 flag:=true job:='{"id":1,"name":"tester"}'
output:
POST /health?hello=world HTTP/1.1
Host: reservation.weihanli.xyz
Schema: https
Api-Version: 2.0
Content-Type: application/json;charset=utf-8
User-Agent: dotnet-HTTPie/0.1.0{"name":"XiaoMing","age":10,"flag":true,"job":{"id":1,"name":"tester"}}HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 03 Aug 2021 14:39:18 GMT
Server: nginx/1.14.1
Transfer-Encoding: chunkedhealthy
因为没有指定 HTTP Method 又包含 request data,所以默认方法是 POST
默认的有 Request Data 的时候,会把数据组装成 JSON,并且会指定
Content-Type
为application/json
如上所示,如果想要使用 form 方式可以指定-f
或--form
Docker
我们也提供了基于 docker 的使用方式,可以使用 weihanli:dotnet-httpie:latest
来获取最新的镜像,目前 docker 镜像是在 runtime 的镜像里装了一下这个 dotnet tool,实现方式可以参考:在 dotnet runtime 的容器中安装 dotnet global tool 以及文末的项目源码
Design
基于中间件的设计,通过不同的中间件处理不同的参数(flag
)
目前一共分成三种中间件
HttpHandlerMiddleware
RequestMiddleware
ResponseMiddleware
// HttpHandlerMiddleware
serviceCollection.AddHttpHandlerMiddleware<FollowRedirectMiddleware>().AddHttpHandlerMiddleware<HttpSslMiddleware>();
// RequestMiddleware
serviceCollection.AddRequestMiddleware<QueryStringMiddleware>().AddRequestMiddleware<RequestHeadersMiddleware>().AddRequestMiddleware<RequestDataMiddleware>().AddRequestMiddleware<DefaultRequestMiddleware>();
// ResponseMiddleware
serviceCollection.AddResponseMiddleware<DefaultResponseMiddleware>();
通过中间件来扩展不同的功能,想要支持新的参数和功能注册一个自定义的中间件即可
这里借用一下 asp.net core 的中间件的图
More
我们还提供了一些特别的特性,比如:
指定
--offline
可以打印请求头和请求 Body 而不发送请求针对
localhost
的请求我们可以简化,比如访问http://localhost:5000/api/values
可以使用:5000/api/values
来访问,默认的 schema 是http
,如果是 https://localhost:5001/api/values,可以通过--schema=https
来指定 schema,完整脚本:http --schema=https :5001/api/values
更多功能等你来发掘~~
目前还只支持比较基本和我觉得比较常用的功能还有一些功能需要增加和改进,有兴趣的童鞋欢迎 issue 欢迎 PR
dotnet-HTTPie 会支持绝大部分 HTTPie 的功能并将优化和改进一些用着不太方便的地方,如果你是 curl 用户,有大佬做了一个从 curl 到 HTTPie 的工具,可以参考: https://curlipie.now.sh/
References
https://github.com/WeihanLi/dotnet-httpie
HTTPie docs: https://httpie.io/docs
Curl to HTTPie request tool: https://curlipie.now.sh/