改装不发送POST请求

时间:2020-09-15 09:20:08

标签: android kotlin retrofit

我似乎无法获得与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()

4 个答案:

答案 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())