java.lang.IllegalArgumentException: Form-encoded method must contain at least one @Field.

    개발 중인 앱에 Retrofit 이라는 통신 라이브러리를 사용중 인데, @FormUrlEncoded 라는 컨텐츠 타입을 사용하는데 파라미터 없이 호출하면 오류가 발생한다. 원인을 찾다 Http에 대한 학습이 필요함을 느꼇다.

https://en.wikipedia.org/wiki/HTTP

 

HTTP - Wikipedia

From Wikipedia, the free encyclopedia Application layer protocol HTTP (Hypertext Transfer Protocol) is an application layer protocol in the Internet protocol suite model for distributed, collaborative, hypermedia information systems.[1] HTTP is the foundat

en.wikipedia.org

    Http는 월드 와이드 웹(WWW) 에서 데이터 통신의 기본 프로코콜로 사용된다. '하이퍼 텍스트'라는 기능으로 유명해진 www은, 하이퍼링크로 다른 페이지나 리소스에 쉽게 접근할 수 있게 해준다. 1997년 HTTP/1 정식 버전을 시작으로 2015년 HTTP/2, 2022년 HTTP/3 버전까지 나왔다.

 

    Http 프로토콜은 인터넷 프로토콜 스위트(or OSI 7계층)에서 애플리케이션 레이어(application layer) 이다. 

Application Layer: 프로토콜 스위트(or OSI 7계층)에는 안정적인 통신을 위한 여러 계층들이 있다. 서버에서 내 앱에 데이터에 오기까지 여러 다른 프로토콜들을 거쳐 마지막에 애플리케이션 레이어에서 프로토콜(HTTP, FTP, SMTP, SSH 등)이 만들어진다.

 

    Http는 클라이언트-서버 모델로 요청-응답으로 기능을 한다. Http는 URI(Uniform Resource Identifier) 와 scheme를 합친 URL(Uniform Resource Locator) 을 사용하여 접근 할 수 있다.

예를 들면 웹브라우저는 클라이언트라고 할 수 있고, 하나 이상의 웹페이지를 호스팅하고 있는 웹서버는 모델이라고 할 수 있다. 클라이언트 에서 요청을 하면 서버는 HTML 또는 다른 컨텐츠를 제공 할 수 있다. Http 응답에는 요청에 대한 결과 상태 정보가 있고, 요청시 데이터가 응답으로 포함되는 경우가 있다.

 

    Http는 stateless 프로토콜로 이 전 통신과 세션을 유지 하지 않고, 데이터 교환을 위해서 (TCP와 같은) 안정적인 프로토콜을 필요로 한다. TCP/IP 환경에서는 주로 80 또는 443 포트를 사용하며 HTTP/3 부터는 TCP프로토콜이 아닌 새로운 QUIC(UDP 기반)을 사용.

요청-응답의 순서로는 클라이언트에서 우선 connection을 요청한다. 서버는 특정 포트로 listening 하다, 요청이 오면  승락 후 클라이언트의 메세지를 기다린다. 이제 클라이언트는 HTTP 메세지를 전달하고 서버는 받은 요청에 맞는 HTTP 응답을 반환한다. 연결은 클라이언트 또는 서버가 언제든지 종료 할 수 있고, 일반적으로 종료 전 HTTP 헤더에 정보를 추가하여 보낸다.

   

    http는 basicdigest 인증을 표준으로 제공, 하지만 둘 다 보안에 부족한 부분이 있어서 JWT와 같은 다른 방식을 응용프로그램단에서 적용. http는 stateless 방식이라 세션을 필요로 하지 않지만, 서비스 발전에 따라 세션 유지가 필요한 경우 쿠키나 서버측에 스토리지를 설정할 수 있음. 

 

    http Request syntax 의 첫 번째 라인은 요청 라인 이다. method + URI + 포로토콜 버전 이다. (ex: GET /images/logo.png HTTP/1.1). 헤더 필드는 0개 이상으로 (case-insensitive) 필드명 + : + value + 캐리지 리턴 이다 (ex: Host : www.example.com). 메인 바디 정보 전에 라인피드가 들어간다. 헤더는 HOST : hostname 외에는 옵션이다. 

    http는 요청 method 들이 있지만 어떤 동작을 할 것인지 의도 정도만 예측용도이고 실제 구현은 서버에서 하기 나름이다. (method는 case sensitive 함 주의.) Get 은 데이터를 가져오는 것 만 가능 하도록 해야함. 캐싱 가능 하여 성능 데이터를 절약할 수 있다. HEAD method는 안에 내용이 아닌 헤더 정보만을 요청. 응답 값의 metadata만을 확인하는 용도. 해당 리소스의 용량을 미리 아는데 유용하게 사용할 수 있다. POST는 어떤 요청(글 게시, 물건 구매 등) 시, PUT은 리소스의 생성 또는 수정을 요청하는데 사용. POST와의 차이점은 PUT은 특정 리소스를 지정.(POST가 글 게시, 물건 구매라면, PUT은 글 수정, 주문서 수정) DELETE는 삭제요청, CONNECT는 보안이나 프록시에 접속하는 경우.. (메서드 부분은 따로 학습이 필요한 것 같다.)

    http 요청에는 Request header가 있는데 요청하는 메인 정보에 앞서 우선 알아야 할 추가적인 정보들을 포함한다. 예를들면 요청하는 컨텐츠의 형식 및 길이, 전송하는 클라이언트의 브라우저, IP 등의 정보, 인증정보, 캐시 등의 정보 등이 있다. 서버에서는 필요할 경우 헤더의 정보를 읽어 메인 요청에 대한 처리 전 선행 작업을 할 수 있다. 

 

    http Response syntax 의 첫 번째 라인은 상태 라인 이다. 프로토콜 버전 + 응답코드 + 이유 (ex: HTTP/1.1 200 OK), 요청과 마찬가지로 헤더 정보와 라인 피드 후 메세지 바디 정보가 들어간다. 

    응답 코드는 클라이언트가 서버의 요청에 대해 상응하는 3자리로 정수이다. 클라이언트는 우선 이 3자리 정수로 가장 먼저 어떤 응답 상태 인지 확인하고 헤더 정보를 통해 좀 더 상세한 정보를 파악 할 수 있다. 모든 상태 코드를 알수는 없지만 가장 앞자리 코드는 무엇을 뜻하는지 알아야 한다. 1XX, 정보를 받았으니 계속 처리, 2XX, 성공, 3XX 요청을 완료하려면 추가 조치가 필요, 4XX 클라이언트 요청 에러, 5XX 서버 에러

+ Recent posts