动手造轮子 —— dotnet-HTTPie

共 4540字,需浏览 10分钟

 ·

2021-08-06 11:58


动手造轮子 —— 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 支持三种:

类型语法
QueryStringname==test
HeaderX-Api-Key:test
Request-Dataname=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 以及文末的项目源码

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/



往期精彩回顾




【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 25
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报