# API 호출해보기
한국영화진흥위원회의 오픈 API(https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do)를 활용합니다.
Postman 앱(https://www.postman.com)을 통해 영화목록 API를 호출하여 결과를 확인해봅니다 (GET 메서드 활용)
### API 문서에 표시된 다양한 매개변수를 적용하여 호출 결과를 확인해봅니다

```
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<movieListResult>
<totCnt>1</totCnt>
<movieList>
<movie>
<movieCd>20226881</movieCd>
<movieNm>뮤턴트 이스케이프</movieNm>
<movieNmEn>Corrective Measures</movieNmEn>
<prdtYear>2022</prdtYear>
<openDt>20230405</openDt>
<typeNm>장편</typeNm>
<prdtStatNm>개봉예정</prdtStatNm>
<nationAlt>캐나다</nationAlt>
<genreAlt>액션,SF,스릴러</genreAlt>
<repNationNm>캐나다</repNationNm>
<repGenreNm>액션</repGenreNm>
<directors>
<director>
<peopleNm>숀 패트릭 오렐리</peopleNm>
</director>
</directors>
<companys/>
</movie>
</movieList>
<source>영화진흥위원회</source>
</movieListResult>
```
### Postman이 우리를 대신해서 만들어준 URL의 모습은 결과적으로 어떘나요?
http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.xml?key=f5eef3421c602c6cb7ea224104795888&openStartDt=2023&movieNm=뮤턴
### URL에서 매개변수는 어떻게 표현하나요?
`key=f5eef3421c602c6cb7ea224104795888` & `openStartDt=2023` & `movieNm=뮤턴`
- 개인 사용자가 API를 사용할 때, 고유의 key값을 받아야 한다.
- 요청 매개변수를 통해 원하는 정보를 입력 하여 원하는 결과값을 얻을 수 있다.
- &으로 구분하여 URL에 요청매개변수를 추가할 수 있다.
# Request - HTTP 요청의 핵심요소에 대해서 알아봅시다.
### method
- GET 은 언제 어떻게 사용하나요?
- 서버에 Request를 보내서 Response를 받는 메서드이다.
- POST 는 언제 어떻게 사용하나요?
- 클라이언트에서 서버로 데이터를 보내고 서버에 데이터를 저장시키는 메서드이다.
- PUT 은 언제 어떻게 사용하나요?
- 서버에 문서를 쓸 때 사용 (Update)
- 서버에 저장된 데이터를 요청하여 수정한다.
- PATCH 는 언제 어떻게 사용하나요?
- 리소스에 부분 수정을 적용
- 모든 API를 수정할 필요가 없을 때 사용
- DELETE 는 언제 어떻게 사용하나요?
- 요청 Resource를 삭제하도록 요청 (항상 보장되진 않는다)
### 위의 질문들을 올바르게 살펴봤다면, 아래의 내용들이 무엇인지 설명할 수 있습니다.
- request-query
- URL에서 키-값 쌍으로 데이터를 전달할 수 있다. 쿼리 매개변수는 데이터 필터링, 정렬 또는 검색에 자주 사용된다.
- `http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.xml?key=f5eef3421c602c6cb7ea224104795888&openStartDt=2023&movieNm=뮤턴` ?뒤에 있는 모든 값들이 request-query라고 할 수 있다.
- request-body(payload)
- HTTP request-body에서 클라이언트에서 서버로 전송되는 데이터를 의미한다. 요청 본문에는 JSON, XML 또는 form-data와 같은 다양한 유형의 데이터가 포함될 수 있다. 요청 본문은 query parameter 또는 path parameter를 사용하여 보낼 수 있는 것보다 더 복잡하거나 크기가 더 큰 데이터를 보내는 데 사용된다. 예를 들어 사용자 관리 시스템에서 새 사용자를 생성하려는 경우 요청 본문의 사용자 데이터를 이름, 이메일, 비밀번호 등과 같은 속성을 포함하는 JSON 개체로 보낸다.
- header
- header란 요청 및 응답에 있어 데이터 타입, 요청 유형, 응답 상태 등을 담는다.
- Content-Type 은 무엇인가요? -> Body의 데이터 타입을 작성한다.
- 파일을 전송할때 주로 사용하는 Content-Type 은 무엇인가요? -> Octet-stream은 특정 구조가 없는 이진 형식이므로 모든 유형의 파일을 전송하는 데 사용할 수 있다. 이 콘텐츠 유형은 이메일 메시지의 파일 다운로드, 파일 업로드 및 첨부 파일에 자주 사용된다.
# Response - HTTP 응답의 핵심요소에 대해서 알아봅시다.
### HTTP Status
- 200, 201 , 202, 204 상태 코드가 각각 무엇을 의미하는지 알아봅시다.
- 200(성공): 서버가 요청을 제대로 처리했다는 뜻이다. 이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다.
- 201(작성됨): 성공적으로 요청되었으며 서버가 새 리소스를 작성했다.
- 202(허용됨): 서버가 요청을 접수했지만 아직 처리하지 않았다.
- 204(콘텐츠 없음): 서버가 요청을 성공적으로 처리했지만 콘텐츠를 제공하지 않는다.
- 400 , 401 , 403 , 404 , 406 상태 코드가 각각 무엇을 의미하는지 알아봅시다.
- 400(잘못된 요청): 서버가 요청의 구문을 인식하지 못했다.
- 401(권한 없음): 이 요청은 인증이 필요하다. 서버는 로그인이 필요한 페이지에 대해 이 요청을 제공할 수 있다. 상태 코드 이름이 권한 없음(Unauthorized)으로 되어 있지만 실제 뜻은 인증 안됨(Unauthenticated)에 더 가깝다.
- 403(Forbidden, 금지됨): 서버가 요청을 거부하고 있다. 예를 들자면, 사용자가 리소스에 대한 필요 권한을 갖고 있지 않다. (401은 인증 실패, 403은 인가 실패라고 볼 수 있음)
- 404(Not Found, 찾을 수 없음): 서버가 요청한 페이지(Resource)를 찾을 수 없다. 예를 들어 서버에 존재하지 않는 페이지에 대한 요청이 있을 경우 서버는 이 코드를 제공한다.
- 406(허용되지 않음): 요청한 페이지가 요청한 콘텐츠 특성으로 응답할 수 없다.
- 500 , 502 , 504 상태 코드가 각각 무엇을 의미하는지 알아봅시다.
- 500(내부 서버 오류): 서버에 오류가 발생하여 요청을 수행할 수 없다.
- 501(구현되지 않음): 서버에 요청을 수행할 수 있는 기능이 없다. 예를 들어 서버가 요청 메소드를 인식하지 못할 때 이 코드를 표시한다.
- 502 (Bad Gateway, 불량 게이트웨이): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 잘못된 응답을 받았다.
- 503(서비스를 사용할 수 없음): 서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다. 이는 대개 일시적인 상태이다.
- 504(게이트웨이 시간초과): 서버가 게이트웨이나 프록시 역할을 하고 있거나 또는 업스트림 서버에서 제때 요청을 받지 못했다.
### 위의 질문들을 올바르게 살펴봤다면, 아래의 내용들이 무엇인지 설명할 수 있습니다.
- 가장 기본적인 성공 요청 응답의 status 코드는 무엇일까요?
- 200
- 인증 또는 권한등의 오류에 대해서 주로 사용되는 status 코드는 무엇일까요?
- 401
- 잘못된 접근, 존재하지 않는 경로에 대한 접근에 주로사용되는 status 코드는 무엇일까요?
- 404
- 서버측 오류에 대해서 주로 사용되는 status 코드는 무엇일까요?
- 500
- status 를 통해서 얻을수 있는 이점은 무엇일까요?
- 클라이언트가 서버로 보낸 요청에 대한 응답이 성공인지 실패인지 또한, 구체적으로 어떤 성공인지 어떤 실패인지를 자세히 알 수 있다.
# URL / URI
URL 과 URI에 대해서 알아봅시다.
- **URI**(Uniform Resource Identifier)는 URL을 포함하는 개념으로 인터넷상의 리소스 `자원 자체`를 식별하는 고유한 문자열 시퀀스
- 야곰 아카데미 사이트의 경우 `yagom-academy.kr`가 URI이다.
- **URL**(Uniform Resource Locator)은 네트워크상에서 통합 자원(리소스)의 `위치`를 나타내기 위한 규약
- 주소 뿐만아니라 프로토콜(https, http, sftp, smp 등)을 포함해야 한다.
- 야곰 아카데미 사이트의 경우 `https://yagom-academy.kr`가 URL이다.
- **URI** ⊃ **URL**이라고 할 수 있다.