使用 dotnet-httpie 执行 http 文件请求

Intro

最近微软在 VS 上开始支持了 http/rest 文件,我们除了 vscode 之外也可以使用 vs 来编辑 http 文件和执行 http 请求了,可以参考: https://learn.microsoft.com/en-us/aspnet/core/test/http-files?view=aspnetcore-8.0

有时候想命令行执行,不想打开 vs/vscode,于是在之前开发的 dotnet-httpie 小工具上增加了执行 http 文件请求的功能.

Sample

Get Started

如下示例,是一个 http 文件里的内容, # 或者 // 表示注释 ,它包含了两个 http 请求,两个请求之前用 ### 分隔开来,

第一个是一个 GET 请求,请求地址是 https://reservation.weihanli.xyz/api/notice

第二个请求是一个 POST 请求, post 一个 json request body 来登录

# Send request to get notice from reservation site
GET https://reservation.weihanli.xyz/api/notice

###

# Sign sparktodo
POST https://sparktodo.weihanli.xyz/api/v2/Account/SignIn
Content-Type: application/json; charset=utf-8

{
  "email": "weihanli@outlook.com",
  "password": "Test1234"
}

可以看到每个 http request 和请求报文其实是很像的,这样就非常的简洁清晰

Variable

再来看一个使用到变量的示例,可以用 @ 来声明变量,如果是在 request 之外的可以被当作是文件级别的变量,如果是在某个 request 内的则只有这个 request 可以使用这个文件,使用变量时使用 {{variableName}} 即可,例子如下:

@baseUrl = https://reservation.weihanli.xyz

###

# @name notice # vs not supported by now
GET {{baseUrl}}/api/notice
Accept: application/json

###

# @name reservationPlaces 
@acceptMediaType = application/json
GET {{baseUrl}}/api/ReservationPlaces
Accept: {{acceptMediaType}}

Moreover

目前 vs 的支持比较有限,实用性有点不太够,dotnet-httpie 支持了部分 vscode 插件 RestSharp 的功能

Environment Variable Reference

首先我们可以引用环境变量,有一些比较像 api-key/password 等敏感的信息可能会放在环境变量,所以觉得环境变量的引用还是比较常见的,对于环境变量我们可以使用 {{$processEnv envName}} 来引用,觉得 processEnv 有点太长了,也支持使用 env 来代替 processEnv,示例如下:

GET {{baseUrl}}/api/ReservationPlaces?t={{$env timestamp}}

但是 vscode 的 RestClient 插件并不支持,如果要使用 RestClient 执行请求的话,建议使用 processEnv

Named request

request 支持使用 # @name requestName 或 # @name=requestName 或 // @name requestName 或 // @name=requestName 来指定 request 的 name

# @name reservationPlaces
GET {{baseUrl}}/api/ReservationPlaces

Request reference

request 有了 name 之后,我们可以在后续 request 中引用前面 request 的 response 中的内容,如下所示

@baseUrl = sparktodo.weihanli.xyz

###
# @name login
POST https://sparktodo.weihanli.xyz/api/v2/Account/SignIn
Content-Type: application/json; charset=utf-8

{
  "email": "weihanli@outlook.com",
  "password": "Test1234"
}

### getVersion

GET https://sparktodo.weihanli.xyz/api/v2/Sync
Authorization: Bearer {{login.response.body.$.data.accessToken}}

这里有两个 request,第一个 request 的 name 是 login 第二个 request 引用了 login 请求的 response body 中的 data.accessToken 字段,并将其作为 Auth 用的 Bearer token,也可以通过 {{requestName.response.headers.headerName}} 引用 response header

dotnet-httpie

使用 dotnet-httpie 执行 http 请求需要使用 0.7.0 及以上版本

dotnet tool update --global dotnet-httpie

安装好之后执行命令如下:

dotnet-http exec HttpStartedSample.http

exec command 后加 http 文件的路径即可

我们执行一下前面 Request reference 的示例,输出结果如下

使用 dotnet-httpie 执行 http 文件请求

login request

使用 dotnet-httpie 执行 http 文件请求

request#2

More

目前 VSCode RestClient、JetBrains 家的 IDE 和 VS 对 http 文件的支持各异,相对来说感觉 vscode RestClient 的支持更多更完善一些, 更多 RestClient 支持的一些用法可以参考:https://github.com/Huachao/vscode-restclient

希望早点有一个相对统一的规范,这样大家无论使用什么 IDE 在哪里使用能够有一致的体验

通过 request reference, 我们可以使用 http 文件来做一些自动化测试,比如前面的示例,每次先登录获取一个 token 然后借助 token 验证其他的接口

Parse http 文件的代码实现在这里 

https://github.com/WeihanLi/dotnet-httpie/blob/dev/src/HTTPie/Implement/HttpParser.cs#L14

有需要的童鞋也可以自取