动手造轮子 — dotnet-HTTPie

Intro

HTTPie 是一个基于 Python 的 HTTP CLI 工具,这也意味着想用 HTTPie 就需要安装 Python 环境,不想装 Python 环境,于是想用 C# 也写一个类似的东西,HTTPie 的语法很简单、简洁而且功能强大,基本可以完全取代 cURL,最近写了一个类似的工具 dotnet-HTTPie,遵循着 HTTPie 的语法,HTTPie 怎么用使用  dotnet-HTTPie 基本也是一样的,简化 API 的测试.

动手造轮子 — dotnet-HTTPie

动手造轮子 — dotnet-HTTPie

动手造轮子 — dotnet-HTTPie

安装

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.0

HTTP/1.1 200 OK
Connection: keep-alive
Date: Tue, 03 Aug 2021 14:40:00 GMT
Server: nginx/1.14.1
Transfer-Encoding: chunked

healthy

不指定 HTTP Method 并且没有 Request Data 的时候默认方法是 GET

-v 代表 --verbose 要输出所有的请求和响应信息,包括请求头、请求body、响应头和响应body,默认地只输出响应头和响应消息体,你也可以通过 --print 来更精确的控制输出选项,例如只打印请求和响应头信息可以用:--print=Hh

H: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: chunked

healthy

因为没有指定 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 以及文末的项目源码

动手造轮子 — dotnet-HTTPie

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 的中间件的图

动手造轮子 — dotnet-HTTPie

 

More

我们还提供了一些特别的特性,比如:

  • 指定 --offline 可以打印请求头和请求 Body 而不发送请求
    动手造轮子 — dotnet-HTTPie
  • 针对 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

    动手造轮子 — dotnet-HTTPie

更多功能等你来发掘~~

目前还只支持比较基本和我觉得比较常用的功能还有一些功能需要增加和改进,有兴趣的童鞋欢迎 issue 欢迎 PR

dotnet-HTTPie 会支持绝大部分 HTTPie 的功能并将优化和改进一些用着不太方便的地方,如果你是 curl 用户,有大佬做了一个从 curl 到 HTTPie 的工具,可以参考: https://curlipie.now.sh/