HTTPie - 사용자 친화적인 Command-line HTTP client

2021. 3. 2. 12:32Dev/Client

300x250
반응형
  1. HTTPie?
  2. 설치
  3. 컨셉
    1. Content-Type 관련 flag
    2. REQUEST_ITEM
      1. 모든 Content-Type에서 사용가능
      2. -j flag와만 사용가능
      3. -f--multipart flag와만 사용가능
  4. 사용 예시
    1. GET Method
    2. localhost 접속
    3. query string
    4. Json 객체로 직렬화할 데이터
    5. Raw Json
    6. Form 요소
  5. 기타 flag
    1. -p, --print=
      1. -h, --headers
      2. -b, --body
      3. -v, --verbose
    2. -A, -a
    3. -F, --follow=
  6. Auth 플러그인

1. HTTPie?

HTTPie는 command-line HTTP client로, 아래와 같은 특징을 가지고 있습니다.

  • Linux, macOS, Windows 운영체제 지원
  • 기본적으로 Json 객체를 직렬화
  • Syntax Highlighting
  • 합리적인 기본 설정값
  • 직관적인 사용법
  • 영구 세션 지원
  • Form, 파일 업로드 지원
  • HTTPS, proxy 및 인증 지원
  • wget과 유사한 다운로드 기능 지원

HTTPie 의 장점을 한눈으로 바라보기 위해 cURL 과 출력 결과를 비교해보도록 합시다.

04

cURL


02

HTTPie

Syntax Highlighting되어있으면서, Json 형태의 response를 Beautify 하여 출력하기 때문에 요청 결과값을 체크하는데에도 유리하고
Requset시 이용되는 인자값의 설정이 보다 직관적이라 cURL에 비해 사용하기에도 보다 편리합니다.


2. 설치

HTTPie CLI는 각 OS에 맞는 설치 명령어를 제공하고 있습니다. [참고]

macOS

macOS에서는 Homebrew를 이용하여 HTTPie를 설치할 수 있습니다.

brew update
brew install httpie

만일, 최신버전으로 업그레이드 하고 싶다면 아래 명령어를 사용하면 됩니다.

brew update
brew upgrade httpie

yum

yum install epel-release
yum install httpie

최신 버전으로 업그레이드 하고 싶다면 아래 명령어를 사용하면 됩니다.

yum upgrade httpie

PyPI

Python 3.7 이상의 최신버전을 사용하고 있을 경우, 파이썬 패키지로 HTTPie를 설치하는 것도 가능합니다.

python -m pip install --upgrade pip wheel
python -m pip install httpie

만일, PyPI 방식으로 설치한 HTTPie를 업그레이드 하고 싶다면, 아래 명령어를 사용하면 됩니다.

python -m pip install --upgrade pip wheel
python -m pip install --upgrade httpie

Windows

Windows에서도 Chocolatey를 이용하면 HTTPie CLI를 간단하게 설치할 수 있습니다.

choco install httpie

업데이트 명령어는 아래와 같습니다.

choco upgrade httpie

3. 컨셉

http[s] [flags] [METHOD] URL [REQUEST_ITEM]

HTTPie는 httphttps scheme을 지원합니다.
HTTP method는 GET, PUT, POST, DELETE를 지원합니다.

method를 생략할 경우, REQUEST_ITEM으로 Data 필드 값 설정되어있지 있을 경우 자동으로 POST method로 인식되고, 없을 경우에는 GET method로 인식됩니다

HTTPie는 기본적으로 Json 객체를 직렬화 합니다.
Json 객체를 직렬화(Serialize) 하기 위해서는, Content-TypeAccept 헤더가 application/json으로 설정되어있어야 합니다.

직접 헤더(또는 flag)를 설정하지 않으면 아래의 헤더가 자동으로 설정됩니다.

name value
Content-Type application/json
Accept application/json, */*;q=0.5

3.1. Content-Type 관련 flag

HTTPie에서는 자주 이용되는 Content-Type을 flag를 이용하여 설정할 수 있게 해줍니다.

-j, --json=

Content-Type:application/json

Default Content-Type
Json 객체를 직렬화 한 값을 설정합니다.

-f, --form=

Content-Type:application/x-www-form-urlencoded
Form 요소의 필드값을 직렬화 한 값을 설정합니다.

--multipart

Content-Type:multipart/form-data
파일 업로드가 포함된 Form 요소의 필드값을 직렬화 한 값을 설정합니다.


3.2. REQUEST_ITEM

REQUEST_ITEM은 http 요청시 사용할 인자값을 의미합니다.
이에 해당되는 값들로는 Header, Query string, (form) Data 등이 있는데.
이 인자값들은 컨텐츠 타입에 따라 설정할 수 있는 item의 차이가 있습니다.


3.2.1. 모든 Content-Type에서 사용가능

HTTP headers (:)

HTTP Header 설정에 이용

Referer:https://demo-old.jiniworld.me  Cookie:foo=bar  User-Agent:bacon/1.0

Querystring (==)

Query string은 다른 말로 url parameter 라고도 부릅니다.
GET 타입에서 이용되는 URL 파라미터 값 설정에 이용됩니다.

name==coco  type=2



3.2.2. -j flag와만 사용가능

-j flag(= Content-Type:application/json)와만 사용가능하다는 것은, 다른 말로 Json 객체로 직렬화하여 전송할 데이터라는 의미입니다.

String data 또는 Form data (=)

Json 객체로 직렬화할 데이터나 Form 요소로부터 전송되는 데이터 설정에 이용됩니다.
파일 경로의 경우 뒤에 @를 붙여서 =@로 설정합니다.

name=jini  age=30  description='Hi, Hello' essay=@Documents/essay.txt

Non-String data (:=)

Json 객체로 직렬화할 데이터 값 중 String이 아닌 값은 := 로 설정합니다.

파일 경로의 경우 뒤에 @를 붙여서 :=@로 설정합니다.

active:=true  age:=28  colors:='["red", "green", "blue"]' package:=@./package.json



3.2.3. -f--multipart flag와만 사용가능

-f(= Content-Type:application/x-www-form-urlencoded),
--multipart(Content-Type:multipart/form-data)

Form File Data (@)

Form 타입 또는 multipart Form 타입의 파일 필드 값 설정에 이용됩니다.

cv@'~/Documents/CV.pdf;type=application/pdf'

4. 사용 예시

4.1. GET Method

GET Method의 경우 method 타입을 생략할 수 있습니다.

https www.jiniworld.me/api/v1/stores/1/menus/2

02

동일하게 동작하는 cURL 코드는 아래와 같습니다.

curl -i "https://www.jiniworld.me/api/v1/stores/1/menus/2"


4.2. localhost 접속

localhost일 경우에는 localhost를 생략하고 아래와 같이 사용할 수 있습니다.

http :8080/api/v1/stores/1/menus/2

07

만일, 서비스가 올려진 포트가 80일 경우에는 : 만 작성하여 짧게 표현할 수 있습니다.

http :/api/v1/stores/1/menus/2

4.3. query string

GET method에 이용되는 query string(= url parameter)은 == 으로 할당합니다.

https www.jiniworld.me/api/v1/stores/1/menus page==2 size==2

01

동일하게 동작하는 cURL 코드는 아래와 같습니다.

curl -i "https://www.jiniworld.me/api/v1/stores/1/menus?page=2&size=2"


4.4. Json 객체로 직렬화할 데이터

https PUT www.jiniworld.me/api/v1/stores/1/events/3 title="2월 할인행사" userId:=2

03

동일하게 동작하는 cURL 코드는 아래와 같습니다.

curl -X PUT -i -H "Content-Type: application/json" -d "{\"title\": \"2월 할인행사\", \"userId\": 2}" https://www.jiniworld.me/api/v1/stores/1/events/3


4.5. Raw Json

Raw Json을 pipe로 전달하거나, json파일을 redirection input을 통해 전달해도 됩니다.

echo '{"title":"2월 할인행사", "userId":2}' | https PUT www.jiniworld.me/api/v1/stores/1/events/3
cat data.json | https PUT www.jiniworld.me/api/v1/stores/1/events/3
https PUT www.jiniworld.me/api/v1/stores/1/events/3 < data.json

4.6. Form 요소

Form 요소의 submit과 같은 기능도 HTTPie로 테스트해볼 수 있습니다.

https -f www.jiniworld.me/login email=coco password=1

06

동일하게 동작하는 cURL 코드는 아래와 같고,

curl -X POST -i -H "Content-Type: application/x-www-form-urlencoded" https://www.jiniworld.me/login -d "{\"email\":\"coco\", \"password\":\"1\"}"


이는 form 요소의 submit 동작시 실행되는 request와 같습니다.

05


5. 기타 flags

5.1. -p, --print=

요청 대한 응답의 출력 형태를 정의합니다.
Request Header/Body, Response Header/Body 중 출력하고자하는 것을 선택할 수 있습니다.
※ 기본 설정값은 -p hb 입니다.

  • H: Request Header
  • B: Request Beader
  • h: Response Header
  • b: Response Beader

5.1.1. -h, --headers

Response Header만 출력합니다.
-p h의 축약 flag입니다.

12


5.1.2. -b, --body

Response Body만 출력합니다.
-p b의 축약 flag입니다.

13


5.1.3. -v, --verbose

Request Header, Request Body, Response Header. Response Body 모두 출력합니다.
-p HBhb의 축약 flag입니다.

08


5.2. -A, -a

인증에 이용되는 Authorization 헤더설정에 관한 flag

flag 설명 종류
-A, --auth-type= 인증 방식 basic, digest, jwt
-a, --auth 인증키

인증 방식에는 Basic HTTP Authentication, Digest HTTP Authentication을 기본적으로 제공해주며, 그 밖의 인증방식을 이용하고 싶다면 플러그인 설치를 통해 이용할 수 있습니다.

별도로 인증방식을 설정하지 않을 경우, basic으로 간주합니다.

jwt 인증방식을 이용하기 위해 httpie-jwt-auth 플러그인을 설치합니다.

pip install -U httpie-jwt-auth

인증 방식을 설정합니다.

https -v -A jwt -a "토큰" demo-old.jiniworld.me/api/v1/users/2

09


물론 굳이 Authentication flag를 이용하지 않고, 헤더로 직접 설정해도 동일하게 동작됩니다.

https -v demo-old.jiniworld.me/api/v1/users/2 Authorization:"Bearer 토큰"

동일하게 동작하는 cURL 코드는 아래와 같습니다.

curl -i -X GET https://demo-old.jiniworld.me/api/v1/users/2 -H "Authorization: Bearer 토큰"


5.3. -F, --follow=

30x Location이 redirect되는 응답시, redirect 된 페이지를 출력하도록 하는 flag입니다.

06

form 요소를 통해 submit처리 후, /v 페이지로 Location이 redirect되는 요청입니다.
별도의 플래그를 설정하지 않을 시, 위와같은 응답만 출력합니다.

여기에 -F 플래그를 설정해보면, 아래와 같이 redirect된 페이지를 출력합니다.

10


여기에 verbose flag 까지 함께 설정하면 보다 redirect되는 모든 상황을 상세히 확인할 수 있습니다.

11


6. Auth 플러그인

Authentication 헤더로 설정하는 Auth관련 설정을 더 간편하게 이용할 수 있도록 도와주는 플러그인도 지원합니다.

참고: HTTPie Auth Plugin

그 중, JWT Auth Plugin 예제를 보여주겠습니다.

httpie-jwt-auth 플러그인을 설치하면

httpie cli plugins install httpie-jwt-auth

아래 옵션을 이용하여 JWT 인증 헤더를 사용할 수 있습니다.

--auth-type=jwt --auth="JWT 토큰"
01-1
300x250
반응형

'Dev > Client' 카테고리의 다른 글

[Visual Studio Code] REST Client를 활용한 REST API 테스트  (0) 2022.02.25