4 minute read

2달만에 올리는, 6월 첫 포스팅 HTTP 아직도 어렵더라,,,

0. 차례

  1. 차례
  2. 들어가기전에
  3. Http 전송 정보
    • HTTP Request 정보
    • HTTP Response 정보
    • JAVA HttpServletRequest 예시
    • 컨텍스트경로 VS 서블릿경로
  4. HTTP 응답코드
  5. HTTP 메소드 정리
    • 메소드 정리
    • POST VS PUT
    • PUT VS PATCH
  6. Java REST API Client Library 알아보기
    • HttpURLConnection
    • HttpClient
    • OKHttp
    • Retrofit
    • RestTemplate
  7. JAVA HttpURLConnection
    • 예제코드
    • setRequestProperty 정리
  8. JAVA HttpClient
    • 예제코드
  9. Java OKHttp
  10. Spring (Response/Request) Body

1. 들어가기전에

회사서, 오랜만에 Rest API를 수정 해야될 일이 있었다, Django로 만들어진 다른 REST API에 요청을 보내야 하는 상황. 그런데 Postman에선 정상적으로 body에 json 으로 받아오는것이,, 코드단에선 text/html형태로 받아오는 문제가 있었다, 그전에는 없던 문제라 조금 당황… HttpURLConnection 에서 setRequestProperty 를 통해 해결이 가능한 문제였다. 이전에 봤었던것 같은데,, 까먹은것 같아 처음부터 끝까지 다시한번 정리해보려한다.

2. Http 전송 정보

  1. 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 /요청 도메인

  2. HTTP Response 정보

    HTTP/1.1 200 OK / 프로토콜 버젼 및 응답코드 Server: Apache / 웹 서버 정보 Content-type: text/html / MIME 타입 (중요) Content-length : 1593 / HTTP BODY 사이즈

    ..... / __HTTP BODY 컨텐츠__
  3. 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;
      }
    }
    
  4. 컨텍스트경로 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는 통신을 동기화로 할지 비동기로 처리 할지 선택 가능
  • 단 스레드를 넘나들 수 없다.

9. RestTemplate

8. Spring (Response/Request) Body

Categories:

Updated: