Api-blueprint: ๋™์ผํ•œ ๋ฆฌ์†Œ์Šค์—์„œ ๋™์ผํ•œ HTTP ๋™์‚ฌ์˜ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ์š”์ฒญ ๋‚ด์šฉ ์œ ํ˜•์ด ๋‹ค๋ฆ„).

์— ๋งŒ๋“  2014๋…„ 02์›” 05์ผ  ยท  10์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: apiaryio/api-blueprint

๋™์ผํ•œ URL์— ๋Œ€ํ•œ POST์— ๋Œ€ํ•ด ๋Œ€๋žต์ ์œผ๋กœ ๋™์ผํ•œ ๋‘ ๊ฐ€์ง€ ์–‘์‹์„ ์ œ๊ณตํ•˜๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ์š”์ฒญ์˜ Content-Type:์ด๋ฉฐ application/json ๋˜๋Š” text/dns(RFC-4207)๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์š”์ฒญ ์–‘์‹์€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ด€๋ จ๋˜์–ด ์žˆ์ง€๋งŒ ์„œ๋กœ ์ง์ ‘ ๋ฒˆ์—ญํ•œ ๊ฒƒ์ด๋ผ๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

Legacy Blueprint๋ฅผ ํ†ตํ•ด ์ด๋ ‡๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FORMAT:1A ํŽธ์ง‘๊ธฐ๋Š” ์ด๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค(๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ํ‘œ์‹œ).

๋‚ด๊ฐ€ ์ด๊ฒƒ์„ ๋‹ฌ์„ฑ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

Question

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

๋์ ์—๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ์˜ˆ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ apiaryio/snowcrash#53 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด Apiary์—์„œ๋Š” ๋งค์šฐ ๊น”๋”ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ๋ฅผ ๋“ค์–ด ...

์‚ฌ์–‘์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค(์˜ˆ: ์ƒˆ๋กœ ๊ณ ์นจ์—์„œ ์•ก์„ธ์Šค ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋˜๋Š” ์•”ํ˜ธ์—์„œ ํ† ํฐ ์ƒ์„ฑ ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” /oauth2/authorize ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋…์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์—์„œ "์•ก์„ธ์Šค ํ† ํฐ ์ƒˆ๋กœ ๊ณ ์นจ" ๋ฐ "์‚ฌ์šฉ์ž ์ธ์ฆ"๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ๋ฉ”์†Œ๋“œ/URL ์กฐํ•ฉ์„ ๋‘ ๋ฒˆ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ API ์‚ฌ์–‘์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŠน์ • ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๊ณ  ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ ํŒจํ„ด์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

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

์—…๋ฐ์ดํŠธ: ํ•œ ๊ฐ€์ง€ ์‘๋‹ต๋งŒ ์–ธ๊ธ‰ํ•˜๋ฉด โ€‹โ€‹์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

FORMAT: 1A
# multiple posts?
## Try to make two posts [/v1/whatever]
### POST
+ Request JSON (application/json)
        { nil: nil }
+ Request DNS (text/dns)
        whatever
+ Response 204

๊ทธ๋Ÿฌ๋‚˜ ์ž„๋ฒ ๋””๋“œ ๋ชจ๋“œ์—์„œ๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ ์š”์ฒญ ์œ ํ˜•๋งŒ ํ‘œ์‹œ). ํŽธ์ง‘๊ธฐ ๋‚ด์˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ๋ฌธ์„œ ๋ณด๊ธฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

@jrep

์ด๊ฒƒ์€ ํ˜„์žฌ Apiary ๋‚ด์žฅ(๋””์ž์ธ)์—์„œ ๋ถ€์กฑํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด @apiaryio ํŒ€์—

@jrep ๋Š” ๋‹ค์ค‘ ์‘๋‹ต์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ์š”์ฒญ(embed์˜ ์ œํ•œ ์˜†์— ์žˆ์Œ)์ž…๋‹ˆ๊นŒ?

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ์ด ์ด๋ฏธ ์œ ํšจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

FORMAT: 1A

## Try to make two posts [/v1/whatever]

### POST

+ Request JSON (application/json)

        JSON

+ Response 200 (application/json)

        JSON       

+ Request DNS (text/dns)

        whatever

+ Response 200 (text/dns)

        whatever

๊ท€ํ•˜์˜ ์˜ˆ๋Š” ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ ํ•˜๋‚˜์˜ ์‘๋‹ต ๋งŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„ค, ๋ฌธ๋ฒ•์ ์œผ๋กœ๋Š” ์œ ํšจํ•˜์ง€๋งŒ ํ‘œํ˜„ํ•ด์•ผ ํ•  ๊ฒƒ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ: ์—ฌ๊ธฐ์—์„œ ํ•„์š”ํ•œ ๊ฒƒ์€ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ "์‘๋‹ต 200"์„ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‘๋‹ต ๋‚ด์šฉ ์œ ํ˜•์€ ์š”์ฒญ ๋‚ด์šฉ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•˜์ง€๋งŒ(๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ ์š”์ฒญ ๋‚ด์šฉ ์œ ํ˜•์€ ๋‘ ๊ฐœ์˜ ์‘๋‹ต ๋‚ด์šฉ ์œ ํ˜•์„ ์˜๋ฏธํ•จ) ๋‘ ์‘๋‹ต์˜ ์ •๋ณด๋„ ์ •ํ™•ํžˆ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜๋‚˜์˜ ์š”์ฒญ๊ณผ ํ•ด๋‹น ์‘๋‹ต์„ ์ •์˜ํ•œ ๋‹ค์Œ ๋‹ค์Œ ์š”์ฒญ/์‘๋‹ต ์Œ์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ƒˆ๋กœ์šด ํ˜•์‹์˜ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜์ด๋ฉฐ ์ด๊ฒƒ์„ ๋งํ•  ์œ ํšจํ•œ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ: ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ถฉ๋ถ„ํžˆ ์ž์„ธํžˆ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์˜ˆ๋Š” ๋‘ ๊ฐ€์ง€ ์‘๋‹ต๊ณผ ๋ช…๋ช…๋œ ์š”์ฒญ์˜ ์‚ฌ์šฉ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฉด์—์„œ ๋‚˜์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์‹œ๋„ ์ค‘์ž…๋‹ˆ๋‹ค.

@jrep

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ์ฒญ์‚ฌ์ง„์˜ ์ผ๋ถ€๋ฅผ ์—ฌ๊ธฐ์— ์ œ์ถœํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

Github ํ‹ฐ์ผ“์œผ๋กœ ํ…์ŠคํŠธ๋ฅผ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. https://dev-staging.akamai.com/api/luna/config-dns/blueprint.apib ์—์„œ ๋ ˆ๊ฑฐ์‹œ ์ฒญ์‚ฌ์ง„์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ์•˜์–ด์š”

POST /v1/zones/{zone}
> Content-Type: application/json
... some data ...
< 204
< Location: /v1/zones/example.com

POST /v1/zones/{zone}
> Content-Type: text/dns
... some other data ...
< 204
< Location: /v1/zones/example.com

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ทผ๋ณธ์ ์œผ๋กœ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

## Zone [/v1/zones/{zone}]

### Create [POST]

+ Request Create with JSON (application/json)

        { ... json data ... }

+ Request Create with DNS (text/dns)

        ... dns data ...

+ Response 204
    + Headers

            Location: /v1/zones/example.com

http://docs.multirequest.apiary.io

์ด๊ฒƒ์€ ๊ณ ์ „์ ์ธ ๋‚ด์šฉ ํ˜‘์ƒ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์‘๋‹ต์— ๋ณธ๋ฌธ์ด ์—†๊ณ  OK(๋ฐ ๋งํฌ)๋งŒ ํ‘œ์‹œ๋˜๋Š” ๋™์•ˆ ๋‹ค์–‘ํ•œ ํ‘œํ˜„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ๋‚ด์šฉ ํ˜‘์ƒ ์ƒ๋Œ€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

### Retrieve [GET]

+ Request Rerieve JSON representation
    + Headers

            Accept: application/json

+ Response 200 (application/json)

        { ... json data ... }

+ Request Rerieve DNS representation
    + Headers

            Accept: text/dns

+ Response 200 (text/dns)

        ... dns data ...

์ฝ˜ํ…์ธ  ์œ ํ˜•์€ ๋‹ค๋ฅด์ง€๋งŒ ์˜๋ฏธ๊ฐ€ ๋™์ผํ•œ(๋ฆฌ์†Œ์Šค ์ƒ์„ฑ) ์—ฌ๋Ÿฌ ์š”์ฒญ์— ๋Œ€ํ•ด ๋ณธ๋ฌธ์ด ์—†๋Š” ํ•˜๋‚˜์˜ ์‘๋‹ต์ด ์ข‹์€ ๋””์ž์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ https://github.com/apiaryio/snowcrash/issues/53 ์˜ ๊ตฌํ˜„์œผ๋กœ ์ด ์ œํ•œ(๋™์ผํ•œ ์ƒํƒœ ๋ฐ ์ฝ˜ํ…์ธ  ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ์‘๋‹ต์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ )์„ ํ•ด์ œํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@jrep ์ด ๋ฌธ์ œ๋Š” https://github.com/apiaryio/snowcrash/issues/53 (Snow Crash v0.10.0)์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋Œ“๊ธ€์„ ๋‹ฌ๊ณ  ๋‹ค์‹œ ์—ฝ๋‹ˆ๋‹ค.

๋์ ์—๋Š” ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜ ์˜ˆ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ apiaryio/snowcrash#53 ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด Apiary์—์„œ๋Š” ๋งค์šฐ ๊น”๋”ํ•˜๊ฒŒ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ๋ฅผ ๋“ค์–ด ...

์‚ฌ์–‘์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค(์˜ˆ: ์ƒˆ๋กœ ๊ณ ์นจ์—์„œ ์•ก์„ธ์Šค ํ† ํฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋˜๋Š” ์•”ํ˜ธ์—์„œ ํ† ํฐ ์ƒ์„ฑ ๋“ฑ)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” /oauth2/authorize ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. API ๋ฌธ์„œ์—์„œ ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๋‹จ์ผ ์ž‘์—…์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์€ ๋…์ž๊ฐ€ ์ดํ•ดํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์‚ฌ์ด๋“œ ๋ฉ”๋‰ด์—์„œ "์•ก์„ธ์Šค ํ† ํฐ ์ƒˆ๋กœ ๊ณ ์นจ" ๋ฐ "์‚ฌ์šฉ์ž ์ธ์ฆ"๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ๋ฉ”์†Œ๋“œ/URL ์กฐํ•ฉ์„ ๋‘ ๋ฒˆ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ API ์‚ฌ์–‘์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŠน์ • ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ฐ•์š”ํ•˜๊ณ  ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๋””์ž์ธ ํŒจํ„ด์— ๋งž์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

์ž˜๋ชป๋œ ๊ตฌ๋ฌธ ๊ฐ•์กฐ ํ‘œ์‹œ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. Body ์ƒ‰์ƒ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

screen shot 2017-02-22 at 16 06 36

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