Невозможно проанализировать JSON ответ через запрос @POST с параметрами, используя Retrofit - PullRequest
0 голосов
/ 11 февраля 2020

Итак, я пытаюсь обработать и напечатать JSON ответ на мой сервер, и я получаю сообщение об ошибке:

java .lang.IllegalStateException: ожидается строка, но была BEGIN_ARRAY в строке 1 столбца 1376 путь $ .scope

Вот как выглядит мой проект:

object RetrofitClientInstance {

private var retrofit: Retrofit? = null
private val BASE_URL = "http://security-xxx.xxx.xxx.corp"

//create a retrofit instance, only if its not created yet
val retrofitInstance: Retrofit?
    get() {

        val okHttpClient = OkHttpClient.Builder()
            .readTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .connectTimeout(60, TimeUnit.SECONDS)
            .build()

        if (retrofit == null) {
            retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
        }
        return retrofit
    }

}

interface GetApiService {

@GET("/xxx/token")
fun getToken(@Header("Authorization") token: String): Call<TokenResponse>

@FormUrlEncoded
@POST("/oauth/token")
fun requestTokenFromEP(
    @Field("client_id") clientId: String,
    @Field("client_secret") clientSecret: String,
    @Field("grant_type") grantType: String,
    @Field("username") username: String,
    @Field("password") password: String,
    @Field("role") role: String
) : Call<TokenResponse>

Это мой класс DTO

data class TokenResponse(
    @SerializedName("access_token")
    var accessToken: String,
    @SerializedName("token_type")
    var tokenType: String,
    @SerializedName("refresh_token")
    var refreshToken: String,
    @SerializedName("scope")
    var scope: String
)

Моя активность

private fun doTokenRequest(){
    //get service
    val service = RetrofitClientInstance.retrofitInstance?.create(GetApiService::class.java)
    //do call
    val call = service?.requestTokenFromEP(TokenUtils.clientId, TokenUtils.clientSecret, TokenUtils.grantType,TokenUtils.username, TokenUtils.password, TokenUtils.role)
    //process it
    call?.enqueue(object : retrofit2.Callback<TokenResponse>{
        override fun onFailure(call: Call<TokenResponse>, t: Throwable) {
            println("failed: " + t.message)
        }

        override fun onResponse(call: Call<TokenResponse>, response: Response<TokenResponse>) {
            println("success")
            var myList: TokenResponse = response.body()!!
            println(myList.toString())
        }

    })

}

JSON Ожидаемый ответ

{
    "access_token": "xxxxx",
    "token_type": "xxxxx",
    "refresh_token": "xxxxxxx",
    "expires_in": 553,
    "scope": "read"
}

Пожалуйста, ребята, если вы можете мне помочь, я хотел бы понять

1 Ответ

0 голосов
/ 13 февраля 2020

Привет, ребята, я уже выяснил ответ:

В моем классе модели переменная "scope" имела тип string, но мой JSON возвращал массив, поэтому приложение возвращало ошибку.

Возвращен ответ JSON: "scope": ["read", "write"]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...