TL;DR

  • Hurl은 간단한 일반 텍스트 형식으로 정의한 HTTP 요청을 실행하고, 여러 요청을 연결하거나 응답을 검사하는 명령줄 도구임.
  • 헤더와 본문에서 값을 캡처하고 XPath, JSONPath, 상태 코드, 응답 헤더, 쿠키, 바이트, 인증서 등을 검증함.
  • REST/JSON, HTML, GraphQL, SOAP/XML을 비롯해 일반 텍스트와 바이너리 요청 본문을 처리함.
  • Rust로 작성된 단일 바이너리이며, 내부 HTTP 엔진은 libcurl 기반으로 빠르고 효율적이며 IPv6/HTTP/3를 지원함.
  • 로컬 개발과 지속적 통합에 사용할 수 있으며, 텍스트·JUnit·TAP·HTML 보고서를 제공하고 HTTP 엔드포인트의 응답 시간도 검사함.

Hurl이란?

  • Hurl은 간단한 일반 텍스트 형식으로 정의한 HTTP 요청을 실행하는 명령줄 도구임.
  • 요청을 연결하고 응답 헤더와 본문에서 값을 캡처하며 쿼리를 평가함. 데이터 가져오기와 HTTP 세션 테스트 모두에 사용할 수 있음.
  • HTML 콘텐츠, REST/SOAP/GraphQL API 및 XML/JSON 기반 API를 처리함.
  • 예제에서 다루는 기능은 요청 헤더, 요청 연결, 쿼리 매개변수, 기본 인증, 폼, 멀티파트, 쿠키, 데이터 캡처, JSON 본문, SOAP/XML 본문, GraphQL, 텍스트 본문, 바이너리 본문, 응답 헤더, 상태 코드·HTTP 버전·XPath·JSONPath·Set-Cookie·바이트 테스트, SSL/TLS 인증서, 재시도, IP 주소임.
  • 예제에서는 GET https://example.org 응답에서 XPath로 CSRF 토큰을 캡처한 뒤 POST https://example.org/login 폼에 {{csrf_token}}을 넣어 요청을 연결함.
  • 요청 헤더와 쿼리 매개변수, 기본 인증, 폼·멀티파트 본문, 쿠키, JSON·SOAP/XML·GraphQL·텍스트·바이너리 본문을 요청에 지정할 수 있음. 예시 요청 대상에는 https://example.org/news, https://example.org/api/health, https://example.org/api/step1, https://example.org/api/step2, https://example.org/api/step3, https://example.org/protected, https://example.org/contact, https://example.org/upload, http://localhost:8000/cookies/set-multiple-request-cookies, https://example.org/index.html, https://example.org/api/dogs, https://example.org/InStock, https://example.org/starwars/graphql, https://example.org/models, https://example.org, https://example.org/order/435, https://example.org/http3, https://example.org/http2, https://example.org/api/tests/4567, http://myserver.com/home, https://example.org/data.tar.gz, https://example.org/data.bin, https://api.example.org/jobs/{{job_id}}가 포함됨.
  • 요청 본문 예시에는 application/soap+xml; charset=utf-8과 SOAPAction: "http://www.w3.org/2003/05/soap-envelope" 헤더가 있으며, SOAP 네임스페이스는 http://www.w3.org/2003/05/soap-envelope, http://example.net임. GraphQL 요청은 인간의 이름·등장 작품·키를 조회하고, JSON·CSV·Base64 데이터 또는 파일도 전송함.
  • 응답 예시는 상태 코드와 Location 헤더, HTTP/2·HTTP/3 버전, HTML 제목·문단 수, JSON 필드와 정규식, 쿠키 속성, SHA-256 및 바이트 접두부, TLS 인증서 속성, IP 주소 등을 검증함.
  • 재시도 예시에서는 https://api.example.org/jobs/{{job_id}}에 최대 10회, 300ms 간격으로 요청하고 JSON 상태가 COMPLETED인지 확인함. IPv4를 지정하거나 응답 IP가 IPv6가 아닌지도 검사할 수 있음.

HTTP 테스트 도구로도 사용

  • Hurl은 HTTP 요청 실행뿐 아니라 응답 테스트에도 사용할 수 있으며, 본문에 대한 XPath·JSONPath 쿼리와 상태 코드·응답 헤더 검증을 지원함.
  • REST/JSON API 예시에서는 POST https://example.org/api/tests 응답의 X-Frame-Options 헤더, JSON 상태, 테스트 개수와 ID 형식을 검사함.
  • HTML 예시에서는 https://example.org 응답의 제목을 XPath로 확인함.
  • GraphQL 예시에서는 POST https://example.org/graphql로 인간의 이름과 키를 조회함.
  • SOAP 예시에서는 POST https://example.org/InStock으로 재고 가격을 요청하며, SOAP 네임스페이스는 https://example.org임.
  • HTTP 엔드포인트 성능 검사 예시에서는 https://example.org/api/v1/pets의 응답 시간이 1,000ms 미만인지 확인함.
  • 응답 바이트 예시에서는 https://example.org/data.tar.gz의 SHA-256 해시를 검증함.
  • CI/CD에 통합할 수 있으며 텍스트, JUnit, TAP, HTML 보고서를 제공함.

Hurl을 선택하는 이유

  • 텍스트 형식: 데브옵스와 개발자 모두를 위한 형식임.
  • 빠른 CLI: 로컬 개발과 지속적 통합에 사용하는 명령줄 도구임.
  • 단일 바이너리: 런타임을 요구하지 않아 설치가 간단함.

curl 기반

  • Hurl은 Rust로 작성된 경량 바이너리이며, 내부 HTTP 엔진은 강력하고 신뢰성 높은 파일 전송 라이브러리인 libcurl을 기반으로 함.
  • 텍스트 파일 형식에 HTTP 요청 실행·테스트를 위한 문법 편의를 더하지만, 핵심은 빠르고 효율적이며 IPv6와 HTTP/3를 지원하는 curl임.

피드백

  • 개발 지원을 위한 GitHub 별표와 피드백·제안·버그 신고·개선 의견을 환영함.
  • 피드백 전송 예시는 POST https://hurl.dev/api/feedback 요청임.

자료

  • 라이선스
  • 블로그
  • 튜토리얼
  • 문서(HTML, PDF, Markdown 다운로드)
  • GitHub