Как получить сырой JSON ответ Retrofit в Котлине? - PullRequest
0 голосов
/ 12 июня 2019

Я новичок в Kotlin и Retrofit. Я хочу вызвать базу от URL до Retrofit и распечатать необработанный ответ JSON. Какая будет самая простая минимальная конфигурация?

Допустим,

base url = "https://devapis.gov/services/argonaut/v0/" 
method = "GET"
resource = "Patient"
param = "id"

Я пытался,

val patientInfoUrl = "https://devapis.gov/services/argonaut/v0/"

        val infoInterceptor = Interceptor { chain ->
            val newUrl = chain.request().url()
                    .newBuilder()
                    .query(accountId)
                    .build()

            val newRequest = chain.request()
                    .newBuilder()
                    .url(newUrl)
                    .header("Authorization",accountInfo.tokenType + " " + accountInfo.accessToken)
                    .header("Accept", "application/json")
                    .build()

            chain.proceed(newRequest)
        }

        val infoClient = OkHttpClient().newBuilder()
                .addInterceptor(infoInterceptor)
                .build()

        val retrofit = Retrofit.Builder()
                .baseUrl(patientInfoUrl)
                .client(infoClient)
                .addConverterFactory(GsonConverterFactory.create())
                .build()

        Logger.i(TAG, "Calling retrofit.create")
        try {
            // How to get json data here
        }catch (e: Exception){
            Logger.e(TAG, "Error", e);
        }
        Logger.i(TAG, "Finished retrofit.create")

    }

Как мне получить необработанный вывод json? Я не хочу реализовывать пользовательский класс данных и разбирать вещи, если это возможно. Есть ли способ?

Обновление 1

Помеченный дублированный пост ( Получить необработанный HTTP-ответ с Retrofit ) не для Kotlin, и мне нужна версия Kotlin.

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Это довольно просто, вам просто нужно настроить сетевые вызовы так.

@FormUrlEncoded
@POST("Your URL")
fun myNetworkCall() : Call<ResponseBody>

Дело в том, что ваш сетевой вызов должен вернуть Call типа ResponseBody. А из ResponseBody вы можете получить ответ в формате String.

Теперь, когда вы вызовете эту функцию для выполнения сетевого вызова, вы получите необработанный строковый ответ.

    MyApi().myNetworkCall().enqueue(object: Callback<ResponseBody>{
        override fun onFailure(call: Call<ResponseBody>, t: Throwable) {
            //handle error here
        }

        override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {
            //your raw string response
            val stringResponse = response.body()?.string()
        }

    })

Это довольно просто. Дайте мне знать, если вы хотите какие-либо другие детали. Надеюсь это поможет. Спасибо

1 голос
/ 12 июня 2019

Вы можете просто использовать тело ответа okhttp, так как модернизация основана на okhttp.

Вот пример, который вы можете преобразовать в свой вариант использования:

@GET("users/{user}/repos")
  Call<ResponseBody> getUser(@Path("user") String user);

Тогда вы можете назвать это так:

Call<ResponseBody> myCall = getUser(...)
myCall.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response, Retrofit retrofit) {
        // access response code with response.code()
        // access string of the response with response.body().string()
    }

    @Override
    public void onFailure(Throwable t) {
        t.printStackTrace();
    }
});

Для получения дополнительной информации см .: https://stackoverflow.com/a/33286112/4428159

...