안녕하세요?
저번 포스팅에서는 Retrofit의 GET 방식에 대해서 알아봤었습니다. 이번에는 POST 방식에 대해서 알아보겠습니다.
POST 메소드로 통신하는 방법은 3가지가 있습니다.
@Body(Raw Data 방식)
@Body 어노테이션은 데이터를 Java Object를 JSON형태로 만들어 서버에 전송합니다.
@POST 어노테이션을 작성하고 괄호안에 baseUrl에 붙일 요청 url의 주소를 작성합니다.
예를들면, 요청하고자 하는 주소가 www.tstory.com/dev/login 라고 가정하면, baseUrl은 www.tstory.com/dev 혹은 www.tstory.com/dev/ 이고, @POST 괄호안에 들어갈 내용은 /login 혹은 login이 되겠습니다.
Request 파라미터를 객체(SignUpParameter)로 만들어 서버에 전송하고 응답을 객체(SignUpResponse)로 전달받습니다. 여기서 Single<SignUpResponse>는 SignUpResponse객체를 Observable 형태로 리턴받겠다는 의미입니다.
여기서 @SerializedName 어노테이션의 괄호안의 값은 객체를 직렬화 및 역직렬화 할 때 이름으로 사용됩니다.
만약 응답이 다음과 같다면, SignUpResponse클래스의 변수명과 json의 변수명을 일치시켜줘야 합니다. 하지만 SignUpResponse클래스의 변수명을 다른 이름으로 명하고 싶다면, @SerializedName 어노테이션의 괄호안 값을 json의 변수명과 일치시켜주면 역직렬화가 가능해집니다.
@FormUrlEncoded와 @Field
application/json과 application/x-www-form-urlencoded 두 가지 content-type의 차이점을 조사해본 내용은 다음과 같습니다.
application/json의 경우 { key : value } 형태로 전송 되며, application/x-www-form-urlencoded의 경우는 key1=value1&key=value2의 형식으로 전송됩니다. 이 외에도 데이터의 압축 여부 등으로 인한 크기의 차이점이 존재합니다.
두번째 POST 방식은 application/x-www-form-urlencoded의 형식으로 요청을 보내기 위해 @FormUrlEncoded와 @Field 어노테이션을 사용합니다.
위의 @Body 방식에서 interface를 다음과 같이 작성할 수 있습니다. @Body 방식과 차이점은 Object를 직렬화 하여 json형식으로 변환하여 요청하는것과 달리 @FormUrlEncoded 방식은 각각의 데이터를 @Field 어노테이션을 붙여 파라미터로 값을 전달하여, key1=value1&key=value2의 형식으로 변환하여 서버에 요청을 날릴 것 입니다.
@FormUrlEncoded와 @FieldMap(FormData 방식)
세번째 방법은 두번째 방법에서 @Field 어노테이션을 붙여 파라미터로 전달한 값들을 @FieldMap 어노테이션을 붙인 Map 객체로 전달하는 방식입니다.
여기까지 @POST 방식으로 서버에 요청하는 3가지 방법을 알아봤습니다. 위의 코드를 참고해 서버 개발 환경에 맞춰 개발하실때 hearder 등을 설정하시면 되겠습니다.
다음 글에서는 이미지, 오디오 파일등을 업로드 하는 Multipart에 대해서 알아보겠습니다.
'안드로이드 > 오픈소스' 카테고리의 다른 글
[안드로이드] Aws Amplify 라이브러리 v1 -> v2 마이그래이션 (0) | 2023.11.29 |
---|---|
Retrofit2 알아보기 3 - @Multipart (1) | 2022.01.03 |
Retrofit2 알아보기 1 - @GET 사용 (0) | 2021.12.29 |