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 网络编程
每月 4,393 次下载
用于 3 crates
1.5MB
37K SLoC
什么是 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 响应。支持不同类型的查询和断言,从响应体上的 XPath 和 JSONPath,到断言状态码和响应头。
非常适合 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 报告
为什么选择 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
资源
目录
示例
要运行示例,请编辑包含示例内容的文件,然后运行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.*/
测试Set-Cookie属性
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
另请参阅
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