hurl

hurl

轻量级HTTP请求运行和测试工具

Hurl是一个轻量级命令行工具,用于执行和测试HTTP请求。它使用简单的纯文本格式定义请求,支持请求链接、值捕获和响应断言。Hurl可处理HTML、REST、SOAP、GraphQL等多种API,既能获取数据又可测试HTTP会话。其丰富的查询和断言功能使其成为理想的HTTP测试工具,易于集成到CI/CD流程中。

HurlHTTP请求API测试命令行工具持续集成Github开源项目
<picture> <source media="(prefers-color-scheme: light)" srcset="/docs/assets/img/logo-light.svg?sanitize=true" > <source media="(prefers-color-scheme: dark)" srcset="/docs/assets/img/logo-dark.svg?sanitize=true" > <img src="/docs/assets/img/logo-light.svg?sanitize=true" width="264px" alt="Hurl Logo"> </picture>

deploy status coverage Crates.io documentation

What's Hurl?

Hurl is a command line tool that runs <b>HTTP requests</b> defined in a simple <b>plain text format</b>.

It can chain requests, capture values and evaluate queries on headers and body response. Hurl is very versatile: it can be used for both <b>fetching data</b> and <b>testing HTTP</b> sessions.

Hurl makes it easy to work with <b>HTML</b> content, <b>REST / SOAP / GraphQL</b> APIs, or any other <b>XML / JSON</b> based APIs.

# 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

Chaining multiple requests is easy:

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

Also an HTTP Test Tool

Hurl can run HTTP requests but can also be used to <b>test HTTP responses</b>. Different types of queries and predicates are supported, from [XPath] and [JSONPath] on body response, to assert on status code and response headers.

<a href="https://hurl.dev/player.html?id=starwars&speed=3"><img src="/docs/assets/img/poster-starwars.png" width="100%" alt="Hurl Demo"/></a>

It is well adapted for <b>REST / JSON APIs</b>

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

<b>HTML content</b>

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

<b>GraphQL</b>

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

and even <b>SOAP APIs</b>

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 can also be used to test the <b>performance</b> of HTTP endpoints

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

And check response bytes

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

Finally, Hurl is easy to <b>integrate in CI/CD</b>, with text, JUnit, TAP and HTML reports

<picture> <source media="(prefers-color-scheme: light)" srcset="/docs/assets/img/home-waterfall-light.png"> <source media="(prefers-color-scheme: dark)" srcset="/docs/assets/img/home-waterfall-dark.png"> <img src="/docs/assets/img/home-waterfall-light.png" width="480" alt="HTML report"/> </picture>

Why Hurl?

<ul class="showcase-container"> <li><b>Text Format:</b> for both devops and developers</li> <li><b>Fast CLI:</b> a command line for local dev and continuous integration</li> <li><b>Single Binary:</b> easy to install, with no runtime required</li> </ul>

Powered by curl

Hurl is a lightweight binary written in [Rust]. Under the hood, Hurl HTTP engine is powered by [libcurl], one of the most powerful and reliable file transfer libraries. With its text file format, Hurl adds syntactic sugar to run and test HTTP requests, but it's still the [curl] that we love: fast, efficient and HTTP/3 ready.

Feedbacks

To support its development, [star Hurl on GitHub]!

[Feedback, suggestion, bugs or improvements] are welcome.

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

Resources

[License]

[Blog]

[Tutorial]

[Documentation]

[GitHub]

Table of Contents

Samples

To run a sample, edit a file with the sample content, and run Hurl:

$ vi sample.hurl GET https://example.org $ hurl sample.hurl

By default, Hurl behaves like [curl] and outputs the last HTTP response's [entry]. To have a test oriented output, you can use [--test option]:

$ hurl --test sample.hurl

A particular response can be saved with [[Options] section][option]:

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

You can check [Hurl tests suite] for more samples.

Getting Data

A simple GET:

GET https://example.org

Requests can be chained:

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

Doc

HTTP Headers

A simple GET with headers:

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

Doc

Query Params

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

Or:

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

With [QueryStringParams] section, params don't need to be URL escaped.

Doc

Basic Authentication

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

Doc

This is equivalent to construct the request with a [Authorization] header:

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

Basic authentication section allows per request authentication. If you want to add basic authentication to all the requests of a Hurl file you could use [-u/--user option]:

$ hurl --user bob:secret login.hurl

[--user] option can also be set per request:

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

Passing Data between Requests

[Captures] can be used to pass data from one request to another:

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

Doc

Sending Data

Sending HTML Form Data

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

Doc

Sending Multipart Form Data

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

Doc

Multipart forms can also be sent with a [multiline string body]:

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-- ```

In that case, files have to be inlined in the Hurl file.

Doc

Posting a JSON Body

With an inline JSON:

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

Doc

With a local file:

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

Doc

Templating a JSON Body

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

Variables can be initialized via command line:

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

Resulting in a PUT request with the following JSON body:

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

Doc

Templating a XML Body

Using templates with [XML body] is not currently supported in Hurl. You can use templates in [XML multiline string body] with variables to send a variable XML body:

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

Doc

Using GraphQL Query

A simple GraphQL query:

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

A GraphQL query with variables:

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 queries can also use [Hurl

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多