안녕하세요,
오늘은 Body와 Field의 차이를 알아보겠습니다.
@Headers("content-type: application/json")
@POST("/api/auth/signup/")
fun createUser(
@Body jsonParams:SignUpResponse,
): Call<SignUpResponse>
@Body
-
@Field
@FormUrlEncoded
@POST("/api/auth/signin")
fun userLogin(
@Field("email") email:String,
@Field("password") password:String
): Call<LoginResponse>
@Field는 위 예시의 아래와 같이 FormUrlencoded를 수행합니다. 한마디로 통신 간에 보안에 신경쓰는 것으로 보이는 상황입니다.
그리하여 아래 사진과 같은 결과가 출력됩니다. Encoded를 했기 때문이죠. (%40)
한마디로 보안을 위해 url을 붙이지 않고, 파라미터를 숨겨@FormUrlEncoded 를 사용합니다.
인자를 @FormUrlEncoded를 사용해서 전달합니다. (key=value&key=value)

Body는 Json 형태의 하나의 객체만 전달합니다. {key: value, key: value} 보통 이런식의 통신이 일반적입니다.
그 다음 data class를 생성합니다.
data class SignUpResponse(val email:String, val password: String)
-
val api = Api.create()
val data = SignUpResponse(email, password1)
api.createUser(data).enqueue(object : Callback<SignUpResponse> {
// 위에서 백엔드와 통신이 이뤄진다.
// 통신의 결과를 아래에서 Response, Failure 출력한다.
override fun onResponse(
call: Call<SignUpResponse>,
response: Response<SignUpResponse>
) {
Log.d(logSignUp, "Email, Password onResponse check - ${email}, ${password1}, ${password2}")
Log.d(logSignUp, "Success")
}
override fun onFailure(call: Call<SignUpResponse>, t: Throwable) {
Log.d(logSignUp, "Email, Password onFailure check - ${email}, ${password1}, ${password2}")
Log.d(logSignUp, "Failed")
}
})
삽질 일기는 여기서 마무리하도록 하겠습니다.
결론은 @FormUrlEncoded, @Field 의 경우 Encoded 하여 데이터를 전송하므로 해당 문제가 발생하였고,
@Body를 사용하여 처리하였습니다.
[Android][Kotlin] Retrofit annotation (@Path, @Query, @Field, @Body)
@Path와 @Query의 차이점 @Path: path variable을 위함 api/member/{username} @Query: query parameter 위함 api/member?username= @Field와 @Query의 차이점 @Query:사용시 파라미터를 url 뒤에 붙여서 전달하는..
yuuj.tistory.com
'Mobile > Kotlin' 카테고리의 다른 글
| Kotlin - 로그인, 로그아웃 이게 맞을까? (0) | 2022.04.28 |
|---|
댓글