如何在 Kotlin 中获取 Retrofit 的原始 json 响应?
How to get raw json response of Retrofit in Kotlin?
我是 Kotlin
和 Retrofit
的新手。我想通过 Retrofit
调用基础 URL
并打印原始 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 输出。如果可能的话,我不想实现用户数据 class 和解析内容。有什么办法吗?
更新 1
标记为重复 post () 不适用于 Kotlin,我需要 Kotlin 版本。
retrofit是基于okhttp的,直接使用okhttp的response body即可。
这是一个您可以转换为您的用例的示例:
@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();
}
});
有关详细信息,请参阅:
很简单,您只需要让您的网络调用像这样运行即可。
@FormUrlEncoded
@POST("Your URL")
fun myNetworkCall() : Call<ResponseBody>
这里的重点是您的网络调用应该 return 类型 ResponseBody
的 Call
。从 ResponseBody
您可以获得字符串格式的响应。
现在,当您调用此函数执行网络调用时,您将获得原始字符串响应。
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()
}
})
很简单。如果您需要任何其他详细信息,请告诉我。希望这可以帮助。谢谢
我是 Kotlin
和 Retrofit
的新手。我想通过 Retrofit
调用基础 URL
并打印原始 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 输出。如果可能的话,我不想实现用户数据 class 和解析内容。有什么办法吗?
更新 1
标记为重复 post (
retrofit是基于okhttp的,直接使用okhttp的response body即可。
这是一个您可以转换为您的用例的示例:
@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();
}
});
有关详细信息,请参阅:
很简单,您只需要让您的网络调用像这样运行即可。
@FormUrlEncoded
@POST("Your URL")
fun myNetworkCall() : Call<ResponseBody>
这里的重点是您的网络调用应该 return 类型 ResponseBody
的 Call
。从 ResponseBody
您可以获得字符串格式的响应。
现在,当您调用此函数执行网络调用时,您将获得原始字符串响应。
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()
}
})
很简单。如果您需要任何其他详细信息,请告诉我。希望这可以帮助。谢谢