如何在Kotlin中获得Retrofit的原始json响应?

时间:2019-06-12 07:22:27

标签: android rest kotlin retrofit http-get

我是KotlinRetrofit的新手。我想通过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

标记为重复的帖子(Get raw HTTP response with Retrofit)不适合Kotlin,我需要Kotlin版本。

2 个答案:

答案 0 :(得分:1)

您可以简单地使用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

答案 1 :(得分:1)

这很容易,您只需要使您的网络呼叫像这样进行即可。

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

这里的意思是您的网络呼叫应返回类型Call的{​​{1}}。从ResponseBody可以得到String格式的响应。

现在,当您调用此函数执行网络调用时,您将获得原始字符串响应。

ResponseBody

非常简单。让我知道您是否需要其他详细信息。希望这可以帮助。谢谢