자바 (28). HTTP? RestAPI? 완전 정복
2달만에 올리는, 6월 첫 포스팅 HTTP 아직도 어렵더라,,,
0. 차례
- 차례
- 들어가기전에
- Http 전송 정보
- HTTP Request 정보
- HTTP Response 정보
- JAVA HttpServletRequest 예시
- 컨텍스트경로 VS 서블릿경로
- HTTP 응답코드
- HTTP 메소드 정리
- 메소드 정리
- POST VS PUT
- PUT VS PATCH
- Java REST API Client Library 알아보기
- HttpURLConnection
- HttpClient
- OKHttp
- Retrofit
- RestTemplate
- JAVA HttpURLConnection
- 예제코드
- setRequestProperty 정리
- JAVA HttpClient
- 예제코드
- Java OKHttp
- Spring (Response/Request) Body
1. 들어가기전에
회사서, 오랜만에 Rest API를 수정 해야될 일이 있었다, Django로 만들어진 다른 REST API에 요청을 보내야 하는 상황. 그런데 Postman에선 정상적으로 body에 json 으로 받아오는것이,, 코드단에선 text/html형태로 받아오는 문제가 있었다, 그전에는 없던 문제라 조금 당황… HttpURLConnection 에서 setRequestProperty 를 통해 해결이 가능한 문제였다. 이전에 봤었던것 같은데,, 까먹은것 같아 처음부터 끝까지 다시한번 정리해보려한다.
2. Http 전송 정보
-
HTTP Request 정보
GET /index.html HTTP/1.1 / 요청 URL정보 (Mehotd /URI HTTP버젼) user-agent: MSIE 6.0; Window NT 5.0 / 사용자 웹 브라우져 종류 accept: test/html; / / 요청 데이터 타입 (응답의 Content-type과 유사) (중요) cookie:name=value / 쿠키(인증 정보) refere: http://abc.com / 경유지 URL host: www.abc.com /요청 도메인
-
HTTP Response 정보
HTTP/1.1 200 OK / 프로토콜 버젼 및 응답코드 Server: Apache / 웹 서버 정보 Content-type: text/html / MIME 타입 (중요) Content-length : 1593 / HTTP BODY 사이즈
..... / __HTTP BODY 컨텐츠__ -
JAVA HttpServletRequest 예시
@Controller public class ExampleController { @RequestMapping("/example") public ResponseEntity<?> getExample(HttpServletRequest httpServletRequest) { // 쿼리를 제외한 프로토콜+도메인+포트번호+컨텍스트 경로+서블릿 경로 // 결과 : http://127.0.0.1:8080/contextpath/servlcetpath/in httpServletRequest.getRequestURL(); // 요청 URL 중 포트번호와 쿼리 사이의 부분을 얻어온다. 컨텍스트경로 + 서블릿 경로 // URL과 URI를 비슷하게 사용들 하지만 다르다. // 결과 : contextpath/servlcetpath/index.jsp httpServletRequest.getRequestURI(); // 컨텍스트 경로를 가지고 온다. // 결과 : /contextpath httpServletRequest.getContextPath(); // 서블릿경로를 얻어 온다. // 결과 : /servlcetpath/index.jsp httpServletRequest.getServletPath(); // 쿼리를 얻어온다. // 결과 : seq=1&type=NOTICE httpServletRequest.getQueryString(); // 도메인을 얻어온다. // 127.0.0.1 httpServletRequest.getDomainName(); // 포트(port)를 얻어옵니다. // 결과 : 8080 httpServletRequest.getServerPort(); return null; } }
-
컨텍스트경로 VS 서블릿경로
https://www.programmersought.com/article/20345578363/ (참조)
3. HTTP 응답코드
- 100번대 (정보전송 임시응답)
- 100 : Continue(클라이언트로 부터 일부 요청을 받았으며 나머지 정보를 계속 요청)
- 101 : Switching protocols
- 200번대 (성공)
- 200 : OK(요청이 성공적으로 수행)
- 201 : Created (PUT 메소드에 의해 원격지 서버에 파일이 생성됨)
- 202 : Accepted(웹 서버가 명령을 수신)
- 203 : Non-authoritative information (서버가 클라이언트 요구 중 일부만 전송)
- 204 : No content, (PUT, POST, DELETE 요청의 경우 성공은 했지만 전송할 데이터가 없는 경우)
- 300번대 (리다이렉션)
- 301 : Moved permanently (요구한 데이터를 변경된 타 URL에 요청함 / Redirect된 경우)
- 302 : Not temporarily
- 304 : Not modified (컴퓨터 로컬의 캐시 정보를 이용함, 대개 gif 등은 웹 서버에 요청하지 않음
- 400번대 (클라이언트 요청에러)
- 400 : Bad Request (사용자의 잘못된 요청을 처리할 수 없음)
- 401 : Unauthorized (인증이 필요한 페이지를 요청한 경우)
- 402 : Payment required (예약됨)
- 403 : Forbidden (접근 금지, 리렉터리 리스팅 요청 및 관리자 페이지 접근 등을 차단)
- 404 : Not Found (요청한 페이지 없음)
- 405 : Method not allowed (혀용되지 않는 http method 사용함)
- 407 : Proxy authentication required (프락시 인증 요구됨)
- 408 : Request timeout (요청 시간 초과)
- 410 : Gone (영구적 사용 금지)
- 412 : Precondition failed (전체 조건 실패)
- 414 : Request-URI too long (요청 URL 길이가 긴 경우)
- 500번대 (서버에러)
- 500 : Internal server error (내부 서버 오류)
- 501 : Not implemented (웹 서버가 처리할 수 없음)
- 503 : Service unnailable (서비스 제공 불가)
- 504 : Gateway timeout (게이트웨이 시간 초과)
- 505 : HTTP version not supported (해당 http 버전 지원되지 않음)
4. HTTP 메소드 정리
- GET
- 전송형태 :
- GET[request-uri]?query_string HTTP/1.1
- Host:[Hostname] 혹은 [IP]
- 설명 : 요청 받은 URI의 정보를 검색하여 응답.
- 전송형태 :
- HEAD
- 전송형태 :
- HEAD [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- 설명 : GET 방식과 동일하지만 응답에 body가 없고 응답 고트와 HEAD만 응답한다. 웹서버 정보확인, 헬스체크, 버저확인, 최종 수정일자등의 확인 용도로 사용한다.
- 전송형태 :
- POST
- 전송형태 :
- POST [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- Content-Length[Length in Bytes]
- Content-Type:[Content Type]
- [데이터]
- 설명 : 요청된 자원을 생성(create) 한다. 새로 작성된 리소스인 경우 HTTP 헤더 항목 Location : URI 주소를 포함하여 응답
- 전송형태 :
- PUT
- 전송형태 :
- PUT [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- Content-Length[Length in Bytes]
- Content-Type:[Content Type]
- [데이터]
- 설명 : 요청된 자원을 수정(UPDATE)한다. 내용 갱신을 위주로 Location : URI를 보내지 않아도 된다. 클라이언트측은 요청된 URI를 그대로 사용하는 것으로 간주함
- 전송형태 :
- PATCH
- 전송형태 :
- PATCH [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- Content-Length[Length in Bytes]
- Content-Type:[Content Type]
- [데이터]
- 설명 : PUT과 유사하게 요청된 자원을 수정(UPDATE)할 때 사용한다. PUT의 경우 자원 전체를 갱신하는 의미지만, PATCH는 해당자원의 일부를 교체하는 의미로 사용.
- 전송형태 :
- DELETE
- 전송형태 :
- DELETE [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- 설명 : 요청된 자원을 삭제할 것을 요청 (안정성 문제로 대부분의 서버에서 비활성)
- 전송형태 :
- CONNECT
- 전송형태 :
- CONNECT [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- 설명 : 동적으로 터널 모드를 교환, 프락시 기능을 요청시 사용.
- 전송형태 :
- TRACE
- 전송형태 :
- TRACE [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- 설명 : 원격지 서버에 루프백 메시지 호출하기 위해 테스트용으로 사용.
- 전송형태 :
- OPTIONS
- 전송형태 :
- OPTIONS [request-uri] HTTP/1.1
- HOST:[Hostname] 혹은 [IP]
- 설명 : 웹서버에서 지원되는 메소드의 종류를 확인할 경우 사용.
- 전송형태 :
5. JAVA REST API Client Library 알아보기
자세한 내용은 아래에서 디테일하게 정리. 먼저 선행하여 내용을 읽고 오길 바란다. 먼저 결론부터 적자면 가볍고 빠른 속도의 성능을 원한다 : HttpURLConnection 개발 생산성 및 안정성 우선시 한다 : Retrofit or RestTemplate(Spring project 한) 을 권장한다.
6. JAVA HttpURLConnection
- 기본 JDK에 포함, (jdk1.2 부터 내장, java.net 패키지에 있다.
- 가벼우며, 핵심적 API만 지원
- HttpClient 보다 성능이 우수,
- 서버로 부터 전달 받은 Response 결과를 Stream 으로 직접 처리해야 하는등, 개발 생산성이 떨어진다.
7. JAVA HttpClient
- Apache 제공
- HttpClient 3버전과 4버전이 있으며 4버전 부터는 HttpComponents 로 불린다. (3버전 4버전 직접 호환은 불가)
- HttpComponents 부터는 Thread에 안정기능 제공
- 상대적으로 무겁다.
- HttpURLConnection 대비 다양한 API 제공
8. OKHttp
- Square의 오픈소스 프로젝트
- OKHttp는 통신을 동기화로 할지 비동기로 처리 할지 선택 가능
- 단 스레드를 넘나들 수 없다.