HTTP 통신 방식
HTTP Request 구조
Start Line
GET /search HTTP/1.1
Headers
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json
Content-Length: 257
Host: google.com
User-Agent: HTTPie/0.9.3
Body
POST /payment-sync HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 83
Content-Type: application/json
Host: intropython.com
User-Agent: HTTPie/0.9.3
{
"imp_uid": "imp_1234567890",
"merchant_uid": "order_id_8237352",
"status": "paid"
}
HTTP Response 구조
Status Line
Response의 상태를 간략하게 나타내주는 부분.
3부분으로 구성되어 있다.
HTTP 버젼
Status code: 응답 상태를 나타내는 코드. 숫자로 되어 있는 코드.
예를 들어, 200
Status text: 응답 상태를 간략하게 설명해주는 부분.
예를 들어, "Not Found"
HTTP/1.1 404 Not Found
Headers
Response의 headers와 동일하다.
다만 response에서만 사용되는 header 값들이 있다.
예를 들어, User-Agent 대신에 Server 헤더가 사용된다.
Body
Response의 body와 일반적으로 동일하다.
Request와 마찬가지로 모든 response가 body가 있지는 않다. 데이터를 전송할 필요가 없을경우 body가 비어있게 된다.
HTTP/1.1 404 Not Found
Connection: close
Content-Length: 1573
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 Aug 2018 07:59:05 GMT
<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">**텍스트**
<title>Error 404 (Not Found)!!1</title>
<style>
*{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
</style>
<a href=//www.google.com/><span id=logo aria-label=Google></span></a>
<p><b>404.</b> <ins>That’s an error.</ins>
<p>The requested URL <code>/payment-sync</code> was not found on this server. <ins>That’s all we know.</ins>
GET
이름 그대로 어떠한 데이타를 서버로 부터 받아(GET)올때 주로 사용하는 Method.
데이터 생성/수정/삭제 없이 받아오기만 할때 사용된다.
가장 간단하고 많이 사용되는 HTTP Method
언급한대로 주로 데이터를 받아올때 사용되기 때문에 request에 body를 안 보내는 경우가 많다.
POST
데이터를 생성/수정/삭제 할때 주로 사용되는 Method.
데이터를 생성 및 수정 할때 많이 사용하기 때문에 대부분의 경우 requst body가 포함되서 보내진다.
OPTIONS
주로 요청 URI에서 사용할 수 있는 Method를 받아올때 사용된다.
예를 들어, /update uri에서 어떤 method를 요청 가능한가(GET? POST?)를 알고 싶으면 먼저 OPTIONS 요청을 사용해서 확인하게 된다.
http -v OPTIONS http://example.org
OPTIONS / HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Length: 0
Host: example.org
User-Agent: HTTPie/0.9.3
HTTP/1.1 200 OK
Allow: OPTIONS, GET, HEAD, POST
Cache-Control: max-age=604800
Content-Length: 0
Date: Mon, 20 Aug 2018 08:37:45 GMT
Expires: Mon, 27 Aug 2018 08:37:45 GMT
Server: EOS (vny006/0450)
메서드 확실하게 비교하고 넘어가기
PUT
POST와 비슷하다. 데이터를 생성 할때 사용되는 Method.
POST와 겹치기 때문에 PUT을 사용하는 곳도 있고 POST로 통일해서 사용하는 곳도 있는데, 최근 몇년 사이에 POST에 밀려서 잘 사용안되는 추세.
DELETE
특정 데이터를 서버에서 삭제 요청을 보낼때 쓰이는 Method
PUT과 마찬가지로 POST에 밀려서 잘 사용안되는 추세.
200 OK
가장 자주 보게되는 status code.
문제없이 다 잘 실행 되었을때 보내는 코드.
301 Moved Permanently
해당 URI가 다른 주소로 바뀌었을때 보내는 코드.
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index.asp
400 Bad Request
해당 요청이 잘못된 요청일대 보내는 코드.
주로 요청에 포함된 input 값들이 잘못된 값들이 보내졌을때 사용되는 코드.
예를 들어, 전화번호를 보내야 되는데 text가 보내졌을때 등등.
401 Unauthorized
유저가 해당 요청을 진행 할려면 먼저 로그인을 하거나 회원 가입을 하거나 등등이 필요하다는것을 나타내려 할때 쓰이는 코드.
403 Forbidden
유저가 해당 요청에 대한 권한이 없다는 뜻.
예를 들어, 오직 과금을 한 유저만 볼 수 있는 데이터를 요청 했을때 등.
404 Not Found
요청된 uri가 존재 하지 않는다는 뜻.
http -v google.com/no-such-uri
GET /no-such-uri HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Connection: keep-alive
Host: google.com
User-Agent: HTTPie/0.9.3
HTTP/1.1 404 Not Found
Content-Length: 1572
Content-Type: text/html; charset=UTF-8
Date: Mon, 20 Aug 2018 08:46:48 GMT
Referrer-Policy: no-referrer
500 Internal Server Error
서버에서 에러가 났을때 사용되는 코드.
API 개발을 하는 백앤드 개발자들이 싫어하는 코드.
URI:
Uniform Resource Identifier
해당 사이트의 특정 자원의 위치를 나타내는 유일한 주소.
/login, /news
https://finance.naver.com/marketindex/
HTTP Method
HTTP request가 의도하는 action을 정의한것.
POST, GET 등등.
Payload
HTTP request에서 보내는 데이터 (body)
웹상에서 사용되는 여러 리소스를 HTTP URI로 표현하고 그 리소스에 대한 행위를 HTTP Method로 정의하는 방식.
즉, 리소스(HTTP URI로 정의된)를 어떻게 한다(HTTP Method + Payload)를 구조적으로 깔끔하게 표현하는것.
Method는 주로 GET과 POST만 사용한다.
PUT과 DELETE 등도 사용하는 곳도 있지만, 그냥 GET과 POST만 사용하는 것이 단순하기 때문에 GET과 POST만 사용하는 추세.
예를 들어, 삼성전자 주식 정보를 받기 위한 HTTP 요청:
HTTP GET https://api.trueshort.com/stock/005930
유저의 보유 주식 종목들을 DB에 저장하는 HTTP 요청
HTTP POST https://api.trueshort.com/user/portfolio
{
"user_id" : 1,
"stocks": [
"005930",
"298730",
"378900"
]
}
여러 장점들이 있지만, 사실 그중 가장 명확한 장점은 바로 self-descriptiveness 이다.
RESTful API는 그 자체만으로도 API의 목적이 쉽게 이해가 된다.
예를 들어, 위의 HTTP GET https://api.trueshort.com/stock/005930
요청의 경우, 문서나 주석이 없이도 "https://api.trueshort.com 라는 API에서 삼성전자 주식에 관한 정보를 HTTP 요청을 통해 받아오는 구나" 라는 해석이 쉽게 가능하다.
/(슬래시)는 계층 관계를 나타낼때 사용된다.
예를 들어, https://api.trueshort.com/kospi/stock/005930 이라는 구조라면, KOSPI에 속해있는 주식(Stock) 중 삼성전자(005930)을 나타내는 것이다.
https://api.shopping.com/books/novel/stephenking 이라는 구조 이라면, 책들중 소설 그리고 소설중 Stephen King의 소설을 나타내는 구조이다.
URI에 _(underscore)는 주로 포함하지않고 또한 영어 대문자보다 소문자를 쓴다. 그리고 너무 긴 단어는 잘 사용하지 않는다. 이 모든건 가독성을 높이기 위해서다.
URI는 명사를 사용한다.
/books/novel/stephenking 이라고 하지 /books/novel/get-stephenking 이라고 잘 하지 않는다.
그 이유는 동사는 GET, POST 같은 HTTP Method를 통해 표현하기 때문이다.
경로끝에는 / 넣지않는다
1. collections 생성
2. add request 생성
3. GET 으로 주소 불러오기 (주소 입력 후 send)
4. api 불러오기 (GET 10.58.0.108:8000/api?category=1)
5. 4번 불러오고 난 후
6. GET -> account 경로 호출하기
7. GET -> /api 경로에 쿼리스트링 2번을 호출하기
8. POST 메서드 활용, GET -> /account/sign-up 경로 호출
9. POST로 호출해 body에 json 데이터 주기
"code : edf64e26-0925-4514-8219-e8df8d3b217e"
10. GET으로 다시 로그인 경로 호출 /account/sign-in
"access_token":
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoyMzN9.xuTU5UEKC1YIq2xQLVuu4wyF4pSs2anzKidUKVQwiow"
11. category 3으로 이동