我似乎无法获得与Retrofit一起使用的POST请求。我的代码:
ApiService.kt包含一个函数
@Headers("Content-Type: application/json")
@POST("resume")
suspend fun resumeAsync(@Body request: JSONObject): Response<String>
然后在ListViewModel.kt中,我有一个函数
fun resume(id: String) {
coroutineScope.launch {
try {
val paramObject = JSONObject()
paramObject.put("id", id)
val response = Api.retrofitService.resumeAsync(paramObject)
if (response.isSuccessful) {
_status.value = "Success: Resumed!"
}
} catch (e: Exception) {
_status.value = "Failure: " + e.message
}
}
}
为什么这不起作用?我没有收到任何错误或回应。如果我将Log.i放入Api或视图模型中,则表示它已触发
通过调试,我发现了此错误:
2020-09-15 11:40:10.904 20622-20622/com.example.app I/NETWORK: Unable to create @Body converter for class org.json.JSONObject (parameter #1) for method ApiService.resumeAsync
我也在使用Moshi
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
private val retrofit = Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(BASE_URL)
.build()
答案 0 :(得分:2)
您可以尝试向okHttp客户端添加日志记录拦截器,并检查请求中要发送和接收的内容。
val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.BODY)
URL /端点正确吗?
您在网址末尾是否缺少“ /”?
您是否已在清单中声明了互联网许可?
等
解决方案:
包装请求正文:
@Body body: RequestBody
val body = RequestBody.create(MediaType.parse("application/json"), obj.toString())
答案 1 :(得分:2)
如果您需要接收原始json,请使用Call<*>
@Headers("Content-Type: application/json")
@POST("resume")
fun resumeAsync(@Body request: JSONObject): retrofit2.Call<String>
内部协程(上面没有suspend
关键字)
// or .awaitResponse() to get Response<*> object
val response = Api.retrofitService.resumeAsync(paramObject).await()
答案 2 :(得分:1)
您可以在这行调试吗
if (response.isSuccessful) {
尝试检查变量response
;
或者您应该检查服务器是否正常工作,请使用Postman
之类的其他工具进行检查
答案 3 :(得分:0)
所以我通过@Paul Nitu的建议解决了我的问题
val body = RequestBody.create(MediaType.parse("application/json"), obj.toString())