改造不发送 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())
我似乎无法让 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())