마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

retrofit2를 이용하여 스프링부트 rest api 통신

0 추천

안녕하세요 질문이 있어 글 남깁니다.

 

서버와 데이터를 주고 받는 코드는 이렇게 되어있고,

callSignUp.enqueue(object : Callback<UserResponse> {
    override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>) {
        if (response.isSuccessful && response.code() == ResponseCode.SUCCESS_POST) {
            Log.d("JoinFragment: onResponse: Success:: ", "SUCCESS")
            join = response.body()
            Log.d("Join: MSG:: ", "${join?.signUp}")

            finish()
        }
    }

    override fun onFailure(call: Call<UserResponse>, t: Throwable) {
        Log.e("JoinFragment: onResponse: Failure:: ", "실패 : $t")
    }
})

 

데이터 클래스는 이렇게 되어 있고,

data class UserResponse(
    @SerializedName("signUp")
    var signUp: String = ""

)

 

POST는 이렇게 되어 있습니다.

@FormUrlEncoded
@POST("api/user/join")
fun signUp(
    @Field("name") name: String,
    @Field("phone") phone: String,
    @Field("password") password: String,
    @Field("auth") auth: String
): Call<UserResponse>

 

스프링부트에서 이런식으로 api가 구현되어 있고

@PostMapping("/api/user/join")
public String signUp(UserJoinRequestDto userJoinRequestDto) {
    return "SUCCESS JOIN PHONE : " + userService.save(userJoinRequestDto);
}

 

코틀린에서 서버로 데이터 전송은 잘 되는 상황입니다..

하지만, 현재 return 값을 받고싶은데

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

오류가 뜨며, object이 필요하지만, string이 온다는 내용의 오류가 뜨는 것 같습니다.

retrofit2 사용예제를 보면 이런식으로 잘 구현되는 것 같은데, 어디가 문제인지를 모르겠어요

string으로 보내고 string으로 받겠다는데 왜 안되는 것일까요?

현재 개발 공부중이라 질문이 좀 엉성한 면이 있네요.. 잘못된 단어나 질문에 대해선 피드백 해주셔도 좋은 공부가 될 것 같습니다.

답변해주시면 감사하겠습니다!

 

 

hand (1,150 포인트) 님이 2021년 9월 7일 질문
hand님이 2021년 9월 7일 수정
postman에서 확인한 return값은

{
"successString": "SUCCESS JOIN PHONE : 01012341234"
}

이런식으로 되어 있는데, 혹시나 object type으로 보내면 되지 않을까 싶어서 바꾼 것입니다.

스트링 타입으로 반환될때는

SUCCESS JOIN PHONE : 01012341234

이렇게만 나오는 것을 확인할 수 있었습니다.

혹시나 제가 부족해서 못알려드린 코드는 말씀해주시면 댓글 달겠습니다!
헤더가 Content-Type: text/html;charset=UTF-8 로 되어 있네요. 이러면 서버에서 JSON 포맷을 리턴하지 못할겁니다. 그래서 응답내용이 html로 온 것 같구요. postman의 경우는 요청에 필요한 헤더값들을 자동으로 세팅해 주는 듯합니다. 어쨋든 서버에서 Content-Type에 application/json을 리턴해야 클라이언트가 응답값을 수신할 때 JSON 포맷으로 인식할 겁니다. 이번에 웹브라우져에서 API의 URL 을 직접 열어서 postman과 동일한 포맷으로 수신이 가능한지 체크해 보세요. 안될 것 같은 생각이 드네요. 그렇다면, SpringBoot로 작성한 서버쪽 코드가 잘못된 것입니다.
한가지 떠오르는 건, 아마도 SpringBoot가 시큐러티 모듈이 들어가 있어서 로그인이 안되었을 경우에는 로그인 페이지를 리턴하는 것 같은데, 이 부분도 체크해 보세요.
늦은시간에 답변 주셔서 정말 감사합니다. 시도해보도록 하겠습니다!!
안녕하세요 spark님 spark님이 말씀하신게 맞았네요 시큐러티 모듈이 들어가서 로그인이 안되었을 경우 로그인 페이지를 리턴했던 것이었습니다. 주석처리해주니 바로 원하는 데이터를 리턴받을 수 있었습니다! 도움 주셔서 정말 감사합니다!!

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...