17 个稳定版本 (3 个主要版本)

4.3.0 2024 年 4 月 24 日
4.2.0 2024 年 1 月 12 日
4.1.0 2023 年 9 月 21 日
4.0.0 2023 年 6 月 30 日
1.2.0 2021 年 3 月 3 日

#48 in 网络编程

Download history 1021/week @ 2024-05-01 1042/week @ 2024-05-08 1331/week @ 2024-05-15 1190/week @ 2024-05-22 808/week @ 2024-05-29 912/week @ 2024-06-05 732/week @ 2024-06-12 913/week @ 2024-06-19 928/week @ 2024-06-26 961/week @ 2024-07-03 940/week @ 2024-07-10 982/week @ 2024-07-17 983/week @ 2024-07-24 1071/week @ 2024-07-31 999/week @ 2024-08-07 1133/week @ 2024-08-14

每月 4,393 次下载
用于 3 crates

Apache-2.0

1.5MB
37K SLoC

Hurl Logo

deploy status coverage Crates.io documentation

什么是 Hurl?

Hurl 是一个命令行工具,可以运行以简单文本格式定义的 HTTP 请求

它可以链式调用请求、捕获值并对响应头和体进行查询评估。Hurl 非常灵活:可以用于 获取数据测试 HTTP 会话。

Hurl 使处理 HTML 内容、REST / SOAP / GraphQL API 或任何其他基于 XML / JSON 的 API 变得容易。

# Get home:
GET https://example.org
HTTP 200
[Captures]
csrf_token: xpath "string(//meta[@name='_csrf_token']/@content)"


# Do login!
POST https://example.org/login?user=toto&password=1234
X-CSRF-TOKEN: {{csrf_token}}
HTTP 302

链式调用多个请求很简单

GET https://example.org/api/health
GET https://example.org/api/step1
GET https://example.org/api/step2
GET https://example.org/api/step3

也是一个 HTTP 测试工具

Hurl 可以运行 HTTP 请求,但也可以用于 测试 HTTP 响应。支持不同类型的查询和断言,从响应体上的 XPathJSONPath,到断言状态码和响应头。

Hurl Demo

非常适合 REST / JSON API

POST https://example.org/api/tests
{
    "id": "4568",
    "evaluate": true
}
HTTP 200
[Asserts]
header "X-Frame-Options" == "SAMEORIGIN"
jsonpath "$.status" == "RUNNING"    # Check the status code
jsonpath "$.tests" count == 25      # Check the number of items
jsonpath "$.id" matches /\d{4}/     # Check the format of the id

HTML 内容

GET https://example.org
HTTP 200
[Asserts]
xpath "normalize-space(//head/title)" == "Hello world!"

GraphQL

POST https://example.org/graphql
```graphql
{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}
```
HTTP 200

甚至 SOAP API

POST https://example.org/InStock
Content-Type: application/soap+xml; charset=utf-8
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="https://example.org">
  <soap:Header></soap:Header>
  <soap:Body>
    <m:GetStockPrice>
      <m:StockName>GOOG</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>
HTTP 200

Hurl 还可以用于测试 HTTP 端点的 性能

GET https://example.org/api/v1/pets
HTTP 200
[Asserts]
duration < 1000  # Duration in ms

并检查响应字节数

GET https://example.org/data.tar.gz
HTTP 200
[Asserts]
sha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;

最后,Hurl 可以轻松集成到 CI/CD 中,支持文本、JUnit、TAP 和 HTML 报告

HTML report

为什么选择 Hurl?

  • 文本格式:适用于 devops 和开发者
  • 快速 CLI:适用于本地开发和持续集成
  • 单个二进制文件:易于安装,无需运行时

由 curl 驱动

Hurl 是用 Rust 编写的轻量级二进制文件。底层,Hurl HTTP 引擎由 libcurl 驱动,这是最强大和最可靠的文件传输库之一。使用其文本文件格式,Hurl 为运行和测试 HTTP 请求添加了语法糖,但它仍然是我们在 curl 中喜爱的:快速、高效且 HTTP/3 兼容。

反馈

为了支持其发展,请在GitHub上star Hurl

欢迎反馈、建议、错误或改进

POST https://hurl.dev/api/feedback
{
  "name": "John Doe",
  "feedback": "Hurl is awesome!"
}
HTTP 200

资源

许可证

博客

教程

文档

GitHub

目录

示例

要运行示例,请编辑包含示例内容的文件,然后运行Hurl

$ vi sample.hurl

GET https://example.org

$ hurl sample.hurl

默认情况下,Hurl的行为类似于curl,并输出最后一个HTTP响应的条目。为了获得面向测试的输出,您可以使用--test选项

$ hurl --test sample.hurl

可以使用[Options]部分将特定响应保存

GET https://example.ord/cats/123
[Options]
output: cat123.txt    # use - to output to stdout
HTTP 200

GET https://example.ord/dogs/567
HTTP 200

您可以通过Hurl测试套件查看更多示例。

获取数据

一个简单的GET

GET https://example.org

请求可以链式调用

GET https://example.org/a
GET https://example.org/b
HEAD https://example.org/c
GET https://example.org/c

文档

HTTP头

一个简单的带有头的GET

GET https://example.org/news
User-Agent: Mozilla/5.0 
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive

文档

查询参数

GET https://example.org/news
[QueryStringParams]
order: newest
search: something to search
count: 100

或者

GET https://example.org/news?order=newest&search=something%20to%20search&count=100

使用[QueryStringParams]部分,参数不需要URL编码。

文档

基本认证

GET https://example.org/protected
[BasicAuth]
bob: secret

文档

这相当于使用Authorization头构造请求

# Authorization header value can be computed with `echo -n 'bob:secret' | base64`
GET https://example.org/protected
Authorization: Basic Ym9iOnNlY3JldA== 

基本认证部分允许每个请求进行认证。如果您想将基本认证添加到Hurl文件的所有请求中,可以使用--user选项

$ hurl --user bob=secret login.hurl

--user选项也可以针对每个请求进行设置

GET https://example.org/login
[Options]
user: bob:secret
HTTP 200

GET https://example.org/login
[Options]
user: alice:secret
HTTP 200

在请求间传递数据

捕获可用于将数据从请求传递到另一个请求

POST https://sample.org/orders
HTTP 201
[Captures]
order_id: jsonpath "$.order.id"

GET https://sample.org/orders/{{order_id}}
HTTP 200

文档

发送数据

发送HTML表单数据

POST https://example.org/contact
[FormParams]
default: false
token: {{token}}
email: john.doe@rookie.org
number: 33611223344

文档

发送多部分表单数据

POST https://example.org/upload
[MultipartFormData]
field1: value1
field2: file,example.txt;
# One can specify the file content type:
field3: file,example.zip; application/zip

文档

可以使用多行字符串主体发送多部分表单

POST https://example.org/upload
Content-Type: multipart/form-data; boundary="boundary"
```
--boundary
Content-Disposition: form-data; name="key1"

value1
--boundary
Content-Disposition: form-data; name="upload1"; filename="data.txt"
Content-Type: text/plain

Hello World!
--boundary
Content-Disposition: form-data; name="upload2"; filename="data.html"
Content-Type: text/html

<div>Hello <b>World</b>!</div>
--boundary--
```

在这种情况下,文件必须在Hurl文件中内联。

文档

发送JSON主体

使用内联JSON

POST https://example.org/api/tests
{
    "id": "456",
    "evaluate": true
}

文档

使用本地文件

POST https://example.org/api/tests
Content-Type: application/json
file,data.json;

文档

模板JSON主体

PUT https://example.org/api/hits
Content-Type: application/json
{
    "key0": "{{a_string}}",
    "key1": {{a_bool}},
    "key2": {{a_null}},
    "key3": {{a_number}}
}

变量可以通过命令行进行初始化

$ hurl --variable a_string=apple \
       --variable a_bool=true \
       --variable a_null=null \
       --variable a_number=42 \
       test.hurl

结果是一个具有以下JSON主体的PUT请求

{
    "key0": "apple",
    "key1": true,
    "key2": null,
    "key3": 42
}

文档

模板XML主体

在Hurl中目前不支持使用带有XML主体的模板。您可以使用变量在XML多行字符串主体中发送可变XML主体

POST https://example.org/echo/post/xml
```xml
<?xml version="1.0" encoding="utf-8"?>
<Request>
    <Login>{{login}}</Login>
    <Password>{{password}}</Password>
</Request>
```

文档

使用GraphQL查询

一个简单的GraphQL查询

POST https://example.org/starwars/graphql
```graphql
{
  human(id: "1000") {
    name
    height(unit: FOOT)
  }
}
```

带有变量的GraphQL查询

POST https://example.org/starwars/graphql
```graphql
query Hero($episode: Episode, $withFriends: Boolean!) {
  hero(episode: $episode) {
    name
    friends @include(if: $withFriends) {
      name
    }
  }
}

variables {
  "episode": "JEDI",
  "withFriends": false
}
```

GraphQL查询也可以使用Hurl模板

文档

测试响应

响应是可选的,HTTP之后的所有内容都是响应断言的一部分。

# A request with (almost) no check:
GET https://foo.com

# A status code check:
GET https://foo.com
HTTP 200

# A test on response body
GET https://foo.com
HTTP 200
[Asserts]
jsonpath "$.state" == "running"

测试状态码

GET https://example.org/order/435
HTTP 200

文档

GET https://example.org/order/435
# Testing status code is in a 200-300 range
HTTP *
[Asserts]
status >= 200
status < 300

文档

测试响应头

使用隐式响应断言来测试头部值

GET https://example.org/index.html
HTTP 200
Set-Cookie: theme=light
Set-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT

文档

或使用带有断言的显式响应断言

GET https://example.org
HTTP 302
[Asserts]
header "Location" contains "www.example.net"

文档

隐式和显式断言可以结合使用

GET https://example.org/index.html
HTTP 200
Set-Cookie: theme=light
Set-Cookie: sessionToken=abc123; Expires=Wed, 09 Jun 2021 10:18:14 GMT
[Asserts]
header "Location" contains "www.example.net"

测试REST API

使用JSONPath断言JSON主体响应(节点值、集合计数等...)

GET https://example.org/order
screencapability: low
HTTP 200
[Asserts]
jsonpath "$.validated" == true
jsonpath "$.userInfo.firstName" == "Franck"
jsonpath "$.userInfo.lastName" == "Herbert"
jsonpath "$.hasDevice" == false
jsonpath "$.links" count == 12
jsonpath "$.state" != null
jsonpath "$.order" matches "^order-\\d{8}$"
jsonpath "$.order" matches /^order-\d{8}$/     # Alternative syntax with regex literal
jsonpath "$.created" isIsoDate

文档

测试HTML响应

GET https://example.org
HTTP 200
Content-Type: text/html; charset=UTF-8
[Asserts]
xpath "string(/html/head/title)" contains "Example" # Check title
xpath "count(//p)" == 2  # Check the number of p
xpath "//p" count == 2  # Similar assert for p
xpath "boolean(count(//h2))" == false  # Check there is no h2  
xpath "//h2" not exists  # Similar assert for h2
xpath "string(//div[1])" matches /Hello.*/

文档

GET https://example.org/home
HTTP 200
[Asserts]
cookie "JSESSIONID" == "8400BAFE2F66443613DC38AE3D9D6239"
cookie "JSESSIONID[Value]" == "8400BAFE2F66443613DC38AE3D9D6239"
cookie "JSESSIONID[Expires]" contains "Wed, 13 Jan 2021"
cookie "JSESSIONID[Secure]" exists
cookie "JSESSIONID[HttpOnly]" exists
cookie "JSESSIONID[SameSite]" == "Lax"

文档

测试字节数据

检查SHA-256响应主体哈希

GET https://example.org/data.tar.gz
HTTP 200
[Asserts]
sha256 == hex,039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81;

文档

SSL证书

检查SSL证书的属性

GET https://example.org
HTTP 200
[Asserts]
certificate "Subject" == "CN=example.org"
certificate "Issuer" == "C=US, O=Let's Encrypt, CN=R3"
certificate "Expire-Date" daysAfterNow > 15
certificate "Serial-Number" matches /[\da-f]+/

文档

检查完整主体

使用隐式主体测试精确的JSON主体匹配

GET https://example.org/api/cats/123
HTTP 200
{
  "name" : "Purrsloud",
  "species" : "Cat",
  "favFoods" : ["wet food", "dry food", "<strong>any</strong> food"],
  "birthYear" : 2016,
  "photo" : "https://learnwebcode.github.io/json-example/images/cat-2.jpg"
}

文档

或显式断言文件

GET https://example.org/index.html
HTTP 200
[Asserts]
body == file,cat.json;

文档

隐式断言支持XML主体

GET https://example.org/api/catalog
HTTP 200
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications with XML.</description>
   </book>
</catalog>

文档

纯文本

GET https://example.org/models
HTTP 200
```
Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""",,5000.00
1996,Jeep,Grand Cherokee,"MUST SELL! air, moon roof, loaded",4799.00
```

文档

一行

POST https://example.org/helloworld
HTTP 200
`Hello world!`

文档

文件

GET https://example.org
HTTP 200
file,data.bin;

文档

报告

HTML报告

$ hurl --test --report-html build/report/ *.hurl

文档

JUnit报告

$ hurl --test --report-junit build/report.xml *.hurl

文档

TAP报告

$ hurl --test --report-tap build/report.txt *.hurl

文档

JSON输出

使用--json选项可以获取运行Hurl文件的有序输出。每个文件将生成一个运行JSON导出。

$ hurl --json *.hurl

其他

HTTP版本

测试HTTP版本(HTTP/1.0、HTTP/1.1、HTTP/2或HTTP/3)

GET https://foo.com
HTTP/3 200

GET https://bar.com
HTTP/2 200

文档

轮询和重试

在发生任何错误时(断言、捕获、状态码、运行时间等...)重试请求

# Create a new job
POST https://api.example.org/jobs
HTTP 201
[Captures]
job_id: jsonpath "$.id"
[Asserts]
jsonpath "$.state" == "RUNNING"


# Pull job status until it is completed
GET https://api.example.org/jobs/{{job_id}}
[Options]
retry: 10   # maximum number of retry, -1 for unlimited
HTTP 200
[Asserts]
jsonpath "$.state" == "COMPLETED"

文档

延迟请求

为每个请求或特定请求添加延迟

# Delaying this request by 5s
GET https://example.org/turtle
[Options]
delay: 5000
HTTP 200

# No delay!
GET https://example.org/turtle
HTTP 200

文档

跳过请求

# a, c, d are run, b is skipped
GET https://example.org/a

GET https://example.org/b
[Options]
skip: true

GET https://example.org/c

GET https://example.org/d

文档

测试端点性能

GET https://sample.org/helloworld
HTTP *
[Asserts]
duration < 1000   # Check that response time is less than one second

文档

使用SOAP API

POST https://example.org/InStock
Content-Type: application/soap+xml; charset=utf-8
SOAPAction: "http://www.w3.org/2003/05/soap-envelope"
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:m="https://example.org">
  <soap:Header></soap:Header>
  <soap:Body>
    <m:GetStockPrice>
      <m:StockName>GOOG</m:StockName>
    </m:GetStockPrice>
  </soap:Body>
</soap:Envelope>
HTTP 200

文档

捕获和使用CSRF令牌

GET https://example.org
HTTP 200
[Captures]
csrf_token: xpath "string(//meta[@name='_csrf_token']/@content)"


POST https://example.org/login?user=toto&password=1234
X-CSRF-TOKEN: {{csrf_token}}
HTTP 302

文档

检查响应体中的字节顺序标记(BOM)

GET https://example.org/data.bin
HTTP 200
[Asserts]
bytes startsWith hex,efbbbf;

文档

AWS签名版本4请求

使用AWS签名版本4生成签名API请求,该版本被多个云提供商使用。

POST https://sts.eu-central-1.amazonaws.com/
[Options]
aws-sigv4: aws:amz:eu-central-1:sts
[FormParams]
Action: GetCallerIdentity
Version: 2011-06-15

访问密钥通过--user提供,可以是命令行选项或[选项]部分中的选项

POST https://sts.eu-central-1.amazonaws.com/
[Options]
aws-sigv4: aws:amz:eu-central-1:sts
user: bob=secret
[FormParams]
Action: GetCallerIdentity
Version: 2011-06-15

文档

手册

名称

hurl - 运行和测试HTTP请求。

概要

hurl [选项] [文件...]

描述

Hurl是一个命令行工具,它以简单的纯文本格式运行HTTP请求。

它可以链式请求,捕获值,并在头部和主体响应上评估查询。Hurl非常灵活,可以用于获取数据和测试HTTP会话:HTML内容、REST / SOAP / GraphQL API或任何其他基于XML / JSON的API。

$ hurl session.hurl

如果没有指定输入文件,则从stdin读取输入。

$ echo GET http://httpbin.org/get | hurl
    {
      "args": {},
      "headers": {
        "Accept": "*/*",
        "Accept-Encoding": "gzip",
        "Content-Length": "0",
        "Host": "httpbin.org",
        "User-Agent": "hurl/0.99.10",
        "X-Amzn-Trace-Id": "Root=1-5eedf4c7-520814d64e2f9249ea44e0"
      },
      "origin": "1.2.3.4",
      "url": "http://httpbin.org/get"
    }

默认情况下,输出到stdout。要将输出重定向到文件,请使用-o, --output选项

$ hurl -o output input.hurl

默认情况下,Hurl执行所有HTTP请求并输出最后一个HTTP调用的响应主体。

要获得面向测试的输出,请使用--test选项

$ hurl --test *.hurl

Hurl文件格式

Hurl文件格式在https://hurl.dev/docs/hurl-file.html中完全文档化

它由一个或多个HTTP请求组成

GET http://example.org/endpoint1
GET http://example.org/endpoint2

捕获值

可以从HTTP响应中重新使用值来执行后续的HTTP请求。

一个典型的例子是CSRF令牌。

GET https://example.org
HTTP 200
# Capture the CSRF token value from html body.
[Captures]
csrf_token: xpath "normalize-space(//meta[@name='_csrf_token']/@content)"

# Do the login !
POST https://example.org/login?user=toto&password=1234
X-CSRF-TOKEN: {{csrf_token}}

有关捕获的更多信息,请在此处查看 https://hurl.dev/docs/capturing-response.html

断言

在Hurl文件中定义的HTTP响应用于断言。响应是可选的。

至少,响应包括对HTTP状态码的断言。

GET http://example.org
HTTP 301

它还可以包含对响应头部的断言

GET http://example.org
HTTP 301
Location: http://www.example.org

可以通过组合查询和断言来包含显式断言

GET http://example.org
HTTP 301
[Asserts]
xpath "string(//title)" == "301 Moved"

通过添加断言,Hurl可以用作测试工具来运行场景。

有关断言的更多信息,请在此处查看 https://hurl.dev/docs/asserting-response.html

选项

curl中存在的选项具有完全相同的语义。

命令行中指定的选项为每个Hurl文件的条目定义,除非它们被标记为仅cli-only(不能在Hurl请求[Options]条目中定义)。

例如

$ hurl --location foo.hurl

将遵循foo.hurl中的每个条目的重定向。您也可以通过一个[Options]部分来仅定义特定条目的选项。例如,这个Hurl文件

GET https://example.org
HTTP 301

GET https://example.org
[Options]
location: true
HTTP 200

将仅对第二个条目进行重定向。

选项 描述
生成带有AWS SigV4签名的Authorization头。

使用-u, --user来指定访问密钥ID(用户名)和秘密密钥(密码)。

要使用临时会话凭据(例如,用于AWS IAM角色),请添加包含会话令牌的X-Amz-Security-Token头。
指定用于对等方验证的证书文件。该文件可以包含多个CA证书,并且必须以PEM格式。
通常Hurl会构建为使用默认文件,因此此选项通常用于更改默认文件。
客户端证书文件和密码。

另请参阅--key
着色调试输出(HTTP响应输出不被着色)。

这是一个仅cli选项。
使用算法br、gzip、deflate中的任何一个请求压缩响应,并自动解压缩内容。
允许Hurl连接花费的最大秒数。

另请参阅-m, --max-time
对于给定的HOST1:PORT1对,连接到HOST2:PORT2。此选项可以在命令行中使用多次。

另请参阅--resolve
即使在发生断言错误时,也继续执行Hurl文件中的请求直到文件末尾。
默认情况下,Hurl在HTTP响应中出现断言错误后退出。

请注意,此选项不会影响多个输入Hurl文件的行为。

所有输入文件都是独立执行的。一个文件的结果不会影响其他Hurl文件的执行。

这是一个仅cli选项。
从文件中读取cookie(使用Netscape cookie文件格式)。

-c, --cookie-jar结合使用,可以在连续的Hurl运行之间模拟cookie存储。

这是一个仅cli选项。
在运行会话后写入cookie到文件(仅适用于一个会话)。
该文件将使用Netscape cookie文件格式写入。

-b, --cookie结合使用,可以在连续的Hurl运行之间模拟cookie存储。

这是一个仅cli选项。
在每个请求之前设置延迟。
控制错误消息的格式(默认为短或长)

这是一个仅cli选项。
将根目录设置为导入Hurl中的文件。这对于多部分表单数据、请求体和响应输出中的文件是使用的。
如果未显式定义,则文件相对于Hurl文件的目录。

这是一个仅cli选项。
从ENTRY_NUMBER(从1开始)执行Hurl文件。

这是一个仅cli选项。
指定与给定glob模式匹配的输入文件。

可以使用多个glob标志。此标志支持常见的Unix glob模式,如*、?和[]。
然而,为了避免Hurl在处理之前,你的shell意外地展开通配符模式,你必须在每个模式周围使用单引号或双引号。

这是一个仅cli选项。
指示Hurl使用HTTP版本1.0而不是它内部首选的HTTP版本。
指示Hurl使用HTTP版本1.1。
指示Hurl使用HTTP版本2。
对于HTTPS,这意味着Hurl在TLS握手期间协商HTTP/2。Hurl默认这么做。
对于HTTP,这意味着Hurl尝试使用Upgrade: 请求头将请求升级到HTTP/2。
指示Hurl尝试对URL中的主机使用HTTP/3,如果HTTP/3连接建立失败,则回退到较早的HTTP版本。HTTP/3仅适用于HTTPS,不适用于HTTP URL。
忽略Hurl文件中定义的所有断言。

这是一个仅cli选项。
在输出中包含HTTP头。

这是一个仅cli选项。
此选项明确允许Hurl执行“不安全”的SSL连接和传输。
在请求之间停止。

这类似于断点,你可以继续(按C键)或退出(按Q键)。

这是一个仅cli选项。
此选项告诉Hurl在解析主机名时仅使用IPv4地址,而不是例如尝试IPv6。
此选项告诉Hurl在解析主机名时仅使用IPv6地址,而不是例如尝试IPv4。
(实验性)并行模式下的最大并行作业数。默认值(在大多数情况下)对应于
当前CPU数量。

另请参阅 --parallel

这是一个仅cli选项。
将每个Hurl文件的结果输出为JSON。格式非常接近HAR格式。

这是一个仅cli选项。
私钥文件名。
跟随重定向。要限制要跟随的重定向数量,请使用--max-redirs选项
类似于-L, --location,但允许将名称和密码发送到网站可能重定向到的所有主机。
如果网站将你重定向到发送你的认证信息(在HTTP基本认证的情况下是明文)的网站,这可能会或可能不会引入安全漏洞。
指定要下载的文件的最大大小(以字节为单位)。如果请求的文件大于此值,则不开始传输。

这是一个仅cli选项。
设置允许的最大重定向跟随数

默认情况下,限制设置为50次重定向。将此选项设置为-1以使其无限。
允许请求/响应花费的最大秒数。这是标准超时。

另请参阅--connect-timeout

这是一个仅cli选项。
在用户的家目录中扫描.netrc文件以获取用户名和密码。

另请参阅--netrc-file--netrc-optional
类似于--netrc,但提供netrc文件的路径。

另请参阅--netrc-optional
类似于--netrc,但使.netrc的使用可选。

另请参阅--netrc-file
不美化输出。

这是一个仅cli选项。
抑制输出。默认情况下,Hurl输出最后一个响应的主体。

这是一个仅cli选项。
以逗号分隔的主机列表,这些主机不使用代理。

覆盖来自环境变量no_proxy的值。
将输出写入文件而不是stdout。
(实验性)并行运行文件。

每个Hurl文件都在自己的工作线程中执行,与其他工作线程不共享任何内容。默认运行模式是顺序的。

另请参阅--jobs

这是一个仅cli选项。
告诉Hurl不要处理给定URL路径中的/../或/./序列。通常,Hurl会根据标准压缩或合并它们,但设置此选项后,您会告诉它不要这样做。
PROTOCOL://HOST[:PORT]> 使用指定的代理。
在DIR中生成HTML报告。

如果HTML报告已存在,它将使用新的测试结果进行更新。

这是一个仅cli选项。
生成JUnit文件。

如果FILE报告已存在,它将使用新的测试结果进行更新。

这是一个仅cli选项。
生成TAP报告。

如果FILE报告已存在,它将使用新的测试结果进行更新。

这是一个仅cli选项。
为特定的主机和端口对提供自定义地址。使用此功能,您可以让Hurl请求使用指定的地址,并防止使用其他通常解析的地址。将其视为命令行上提供的类似/etc/hosts的替代品。
最大重试次数,0表示不重试,-1表示无限重试。如果发生任何错误(断言、捕获、运行时等),则会重试。
每次重试之间的持续时间(以毫秒为单位)。默认值为1000毫秒。
(Windows)此选项告诉Hurl禁用证书吊销检查。警告:此选项放宽了SSL安全性,并使用此标志时,您确实要求这样做。

这是一个仅cli选项。
激活测试模式:使用此功能,不再输出HTTP响应,报告每个测试的Hurl文件的进度,并在所有文件运行完毕后显示文本摘要。

这是一个仅cli选项。
执行Hurl文件到ENTRY_NUMBER(从1开始)。
忽略文件剩余部分。这对于调试会话很有用。

这是一个仅cli选项。
(HTTP)通过此Unix域套接字连接,而不是使用网络。
为每个请求添加基本身份验证头。
指定要发送给HTTP服务器的User-Agent字符串。

这是一个仅cli选项。
定义要在Hurl模板中使用的变量(名称/值)。
设置包含您定义的变量的属性文件。

每个变量都定义为一个精确的name=value,就像在--variable选项中一样。

请注意,定义变量两次会产生错误。

这是一个仅cli选项。
在标准错误流上打开详细输出。
对调试很有用。

以'>'开头的行表示Hurl发送的数据。
以'<'开头的行表示Hurl接收的数据。
以'*'开头的行表示Hurl提供的附加信息。

如果您只想在输出中包含HTTP头,-, --include可能是您想要的选项。
在标准错误流上打开更多详细输出。

--verbose选项不同,此选项在标准错误上输出完整的HTTP请求和响应正文。此外,以'**'开头的行是libcurl调试日志。
使用帮助。此列表包含所有当前命令行选项及其简短说明。
打印版本信息

环境

环境变量只能指定为小写。

使用环境变量设置代理与使用-, --proxy选项的效果相同。

变量 描述
http_proxy[PROTOCOL://]<HOST>[:PORT] 设置用于HTTP的代理服务器。
https_proxy[PROTOCOL://]<HOST>[:PORT] 设置用于HTTPS的代理服务器。
all_proxy[PROTOCOL://]<HOST>[:PORT] 如果没有设置协议特定的代理,则设置用于代理的服务器。
no_proxy<逗号-分隔的列表主机> 不应通过任何代理的主机名列表。
HURL_name value 定义要在Hurl模板中使用的变量(名称/值)。这与--variable--variables-file选项类似。
无颜色 当设置为非空字符串时,不着色输出(参见 --no-color 选项)。

退出代码

描述
0 成功。
1 解析命令行选项失败。
2 输入文件解析错误。
3 运行时错误(例如无法连接到主机)。
4 断言错误。

WWW

https://hurl.dev

另请参阅

curl(1) hurlfmt(1)

安装

二进制安装

Linux

预编译的二进制文件可在 Hurl 最新 GitHub 发布版 获取。

$ INSTALL_DIR=/tmp
$ VERSION=4.3.0
$ curl --silent --location https://github.com/Orange-OpenSource/hurl/releases/download/$VERSION/hurl-$VERSION-x86_64-unknown-linux-gnu.tar.gz | tar xvz -C $INSTALL_DIR
$ export PATH=$INSTALL_DIR/hurl-$VERSION:$PATH

Debian / Ubuntu

对于 Debian / Ubuntu,Hurl 可以使用每个 Hurl 发布版中提供的 .deb 二进制文件安装。

$ VERSION=4.3.0
$ curl --location --remote-name https://github.com/Orange-OpenSource/hurl/releases/download/$VERSION/hurl_${VERSION}_amd64.deb
$ sudo apt update && sudo apt install ./hurl_${VERSION}_amd64.deb

Alpine

Hurl 可在 testing 频道获取。

$ apk add --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing hurl

Arch Linux / Manjaro

Arch Linux 及其衍生发行版的 hurl-bin 软件包 可通过 AUR 获取。

NixOS / Nix

在稳定频道上可获取 NixOS / Nix 软件包

macOS

Intel 和 ARM CPU 的预编译二进制文件可在 Hurl 最新 GitHub 发布版 获取。

Homebrew

$ brew install hurl

MacPorts

$ sudo port install hurl

FreeBSD

$ sudo pkg install hurl

Windows

压缩文件

您可以从 Hurl 最新 GitHub 发布版 的独立 zip 文件中安装 Hurl。您需要更新您的 PATH 变量。

安装程序

您还可以从 Hurl 最新 GitHub 发布版 获取可执行安装程序。

Chocolatey

$ choco install hurl

Scoop

$ scoop install hurl

Windows软件包管理器

$ winget install hurl

Cargo

如果您是 Rust 程序员,可以使用 cargo 安装 Hurl。

$ cargo install hurl

conda-forge

$ conda install -c conda-forge hurl

Hurl 还可以与 conda-forge 驱动的包管理器(如 pixi)一起安装。

Docker

$ docker pull ghcr.io/orange-opensource/hurl:latest

npm

$ npm install --save-dev @orangeopensource/hurl

从源码构建

Hurl 源代码可在 GitHub 上获取。

在Linux上构建

Hurl 依赖于 libssl、libcurl 和 libxml2 本地库。您需要在您的平台上获取它们的发展文件。

基于Debian的发行版

$ apt install -y build-essential pkg-config libssl-dev libcurl4-openssl-dev libxml2-dev

基于Red Hat的发行版

$ yum install -y pkg-config gcc openssl-devel libxml2-devel

基于Arch的发行版

$ pacman -S --noconfirm pkgconf gcc glibc openssl libxml2

基于Alpine的发行版

$ apk add curl-dev gcc libxml2-dev musl-dev openssl-dev 

在macOS上构建

$ xcode-select --install
$ brew install pkg-config

Hurl 使用 Rust 编写。您应该安装最新稳定版本。

$ curl https://sh.rustup.rs -sSf | sh -s -- -y
$ source $HOME/.cargo/env
$ rustc --version
$ cargo --version

然后构建 Hurl

$ git clone https://github.com/Orange-OpenSource/hurl
$ cd hurl
$ cargo build --release
$ ./target/release/hurl --version

在Windows上构建

请遵循 Windows 部分的 contrib

依赖关系

~27–40MB
~834K SLoC