Httpie: ํŒŒ์ด์ฌ API

์— ๋งŒ๋“  2017๋…„ 01์›” 08์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: httpie/httpie

HTTP ํ”„๋กฌํ”„ํŠธ*๋Š” ์‹ค์ œ HTTP ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด httpie.core.main() ํ•จ์ˆ˜์— ํฌ๊ฒŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋“ค์–ด์˜ค๋Š” ์ฟ ํ‚ค ์„ค์ •๊ณผ ๊ฐ™์€ ์ผ๋ถ€ HTTP ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด Python์—์„œ ์‘๋‹ต ๊ฐœ์ฒด(๋ณด๋‹ค ๊ตฌ์ฒด์ ์œผ๋กœ requests.Response ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜์ง€๋งŒ httpie.core.main() ๋Š” ์ด๋Ÿฌํ•œ API๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP Prompt๋Š” sys.settrace() ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTPie๋ฅผ "ํ•ดํ‚น"ํ•˜์—ฌ ๋‹ค์Œ ์ฝ”๋“œ์™€ ๊ฐ™์ด httpie.core.get_response() ์—์„œ ๋ฐ˜ํ™˜๋œ ์‘๋‹ต ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

https://github.com/eliangcs/http-prompt/blob/cbd092299/http_prompt/execution.py#L430

HTTPie๊ฐ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‚ด๋ถ€ ์‘๋‹ต ๊ฐœ์ฒด์— ๋” ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” API๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

* ์•„์ง ๋ชจ๋ฅด์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด: HTTP Prompt๋Š” HTTPie์˜ ๋Œ€ํ™”ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ž˜ํผ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

HTTPony๋Š” HTTPie์˜ API๋ฅผ ๊ฑฐ์˜ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

from httpie.cli import parser
from httpie.context import Environment
from httpie.output import streams

์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์˜ ํ•ต์‹ฌ์€ requests.models.Request ๋ฅผ streams.build_output_stream ํ•˜๊ณ  streams.write_stream ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/mblayman/httpony/blob/master/httpony/application.py ์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ์ผ

๋ชจ๋“  5 ๋Œ“๊ธ€

๋„ค, ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. main() ๋Š” ์ข…๋ฃŒ ์ƒํƒœ ์ฝ”๋“œ์™€ ์ตœ์ข… HTTP ์‘๋‹ต์„ ๋ชจ๋‘ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ parse args๋„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@eliangcs ์ €๋Š” ๋” ํฐ ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํƒ€์‚ฌ ๋„๊ตฌ์—์„œ ์‚ฌ์šฉํ•  ์•ˆ์ •์ ์ด๊ณ  ๋ฌธ์„œํ™”๋œ api.py ๋ชจ๋“ˆ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋‚ด๋ถ€ ๋„๊ตฌ๋ฅผ ๊ฑด๋“œ๋ฆด ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณ€ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

http-prompt ํ˜„์žฌ HTTPie์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ”Œ๋ž˜์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? args๊ฐ€ ์žˆ๋Š” ๋นˆ ๋ฉ”์„œ๋“œ์™€ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ ๋…์ŠคํŠธ๋ง์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์ถœ๋ฐœ์ ์€ http-prompt ํ•„์š”ํ•œ ๋ชจ๋“  ์ˆ˜์ž…ํ’ˆ์„ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// ์ฐธ์กฐ @mblayman

@jkbrzt ๋‚ด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด grep์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฐพ์€ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

# http_prompt/cli.py
from httpie.plugins import FormatterPlugin  # just to avoid cyclic import, not really used
from httpie.output.formatters.colors import Solarized256Style  # to support solarized theme

# http_prompt/execution.py
from httpie.context import Environment  # to construct a custom Environment and pass it to httpie_main
from httpie.core import main as httpie_main  # to generate output and the response object

HTTPony๋Š” HTTPie์˜ API๋ฅผ ๊ฑฐ์˜ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

from httpie.cli import parser
from httpie.context import Environment
from httpie.output import streams

์ˆ˜ํ–‰๋˜๋Š” ์ž‘์—…์˜ ํ•ต์‹ฌ์€ requests.models.Request ๋ฅผ streams.build_output_stream ํ•˜๊ณ  streams.write_stream ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. https://github.com/mblayman/httpony/blob/master/httpony/application.py ์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ์ผ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ํ†ต๊ณผํ•˜๊ณ  ๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€์žˆ๋Š” ๊ฒƒ๋“ค์„ ๊ณต์‹ํ™” ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ httpie.api ์— ๋ช‡ ๊ฐ€์ง€ ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ช…์‹œ์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์— ์˜์กดํ•  ์ˆ˜ ์žˆ๊ณ /์žˆ์„ ์ˆ˜ ์žˆ๊ณ  ๋‚ด๋ถ€์— ๋น„ํ•ด ์•ˆ์ •์„ฑ์„ ์–ด๋Š ์ •๋„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. httpie.api -exported ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋„ ๋ณ€๊ฒฝ ๋กœ๊ทธ์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰