改造不发送 POST 请求

Retrofit doesn't send POST request

我似乎无法让 POST 请求与 Retrofit 一起工作。我的代码:

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

您可以尝试向您的 okHttp 客户端添加一个日志记录拦截器,并检查您在请求中发送和接收的内容。

val logging = HttpLoggingInterceptor()
logging.setLevel(HttpLoggingInterceptor.Level.BODY)

url/endpoint 正确吗?

url 末尾是否缺少“/”?

您是否在清单中声明了互联网许可?

等等

解决方法:

包装请求正文:

@Body body: RequestBody 

val body = RequestBody.create(MediaType.parse("application/json"), obj.toString())

如果您需要接收原始 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()

你能在这条线上调试吗

if (response.isSuccessful) {

尝试检查变量 response;

或者你应该检查服务器是否工作,用其他工具检查它 Postman

所以我按照@Paul Nitu 推荐的方法解决了我的问题

val body = RequestBody.create(MediaType.parse("application/json"), obj.toString())