Android Kotlin Retrofit Post Request 输入的数据未发送
Posted
技术标签:
【中文标题】Android Kotlin Retrofit Post Request 输入的数据未发送【英文标题】:Android Kotlin Retrofit Post Request Inputted data does not sent 【发布时间】:2020-09-29 08:58:27 【问题描述】:所以我必须处理一个 POST 请求,其正文数据取自表单中的某些输入。
该服务的端点是https://someUrl.com/switching-product/switch?orderID=A002&procode=0200011&nip=P19120
Postman 返回的响应类似于this。
这个请求的正文是这样的:
在这种情况下,我有这个接口用于处理 POST 请求:
///Endpoint: https://someUrl.com/switching-product/switch?orderID=A002&procode=0200011&nip=P19120
interface editProductDetail
@FormUrlEncoded
@POST("switch")
fun editProductDetail(@Query("orderID") orderID: String,
@Query("procode") procode: String,
@Query("nip") nip : String,
@Field("procode_new") procodeNew: String,
@Field("item_qty_new") itemQtyNew: String,
@Field("item_price_new") itemPriceNew: String,
@Field("item_name_new") itemNameNew: String,
@Field("total_price_new") totalPriceNew: String): Call<OutstandingOrderDetailPOJODataClassDetailItem>
这是我使用的数据类:
data class OutstandingOrderDetailPOJODataClassDetailItem(
@field:SerializedName("item_price_new")
val itemPriceNew: Int? = null,
@field:SerializedName("item_name_new")
val itemNameNew: String? = null,
@field:SerializedName("total_price")
val totalPrice: Int? = null,
@field:SerializedName("item_price")
val itemPrice: Int? = null,
@field:SerializedName("item_name")
val itemName: String? = null,
@field:SerializedName("status_refund")
val statusRefund: String? = null,
@field:SerializedName("detail_id")
val detailId: Int? = null,
@field:SerializedName("procode_new")
val procodeNew: String? = null,
@field:SerializedName("refund_date")
val refundDate: String? = null,
@field:SerializedName("request_refund")
val requestRefund: String? = null,
@field:SerializedName("procode")
val procode: String? = null,
@field:SerializedName("last_update")
val lastUpdate: String? = null,
@field:SerializedName("item_qty_new")
val itemQtyNew: Int? = null,
@field:SerializedName("order_id")
val orderId: String? = null,
@field:SerializedName("total_price_new")
val totalPriceNew: Int? = null,
@field:SerializedName("item_qty")
val itemQty: Int? = null,
@field:SerializedName("refund")
val refund: Int? = null
)
正如您在上面看到的,body 也具有包含在数据类中的属性。 (该数据类也用于App中的相关服务,该服务使用该服务的输入数据)。
这是触发 POST 请求的函数:
NetworkConfig().editOutstandingOrderProductDetailService().editProductDetail(
selectedOrderId,
selectedProcode,
selectedNip,
procodeNew,
itemNewQty,
itemPriceNew,
itemNewName,
totalPriceNew
).enqueue(object :
Callback<OutstandingOrderDetailPOJODataClassDetailItem>
override fun onFailure(call: Call<OutstandingOrderDetailPOJODataClassDetailItem>, t: Throwable)
Log.i("Order", "It Failed!!")
if (call.isCanceled)
Toast.makeText((activity as AppCompatActivity), "Request Aborted", Toast.LENGTH_SHORT).show()
else
Toast.makeText((activity as AppCompatActivity), t.localizedMessage, Toast.LENGTH_SHORT).show()
override fun onResponse(
call: Call<OutstandingOrderDetailPOJODataClassDetailItem>,
response: Response<OutstandingOrderDetailPOJODataClassDetailItem>
)
Log.i("Order", "Switching Process done!!!")
Log.i("Order", "Status: $response.body()")
)
从上面,它在 logCat 中打印响应,如下所示:
我在这里遗漏了什么吗?或者有什么我需要改变的?如果有任何我错过指出的细节,请告诉我!
【问题讨论】:
请求是 JSON 正文请求而不是 formurl 编码 @silentsudo 所以...我应该如何修改代码以便它可以处理正文请求?我应该在 Interface 和 The function 中编辑两者来触发 POST 请求,对吧?抱歉,在处理 POST 请求方面我真的很陌生。 是响应 200 吗? @Sairaj Sawant 在邮递员中?是的。 不是邮递员。在onResponse
中尝试log.d("tag", response )
【参考方案1】:
您的请求是JSON object
,而不是formurl
。
@Field
标签用于将参数作为formurl
传递时使用
使用带有@Body 标签的model class 或JsonObject 以JsonObject
的形式传递参数。
模型类示例,
data class TestClass
val text1: String,
val text2: String
现在将这个类作为请求传递
@POST("URL")
fun apiName(@Body request: TestClass);
JSON 对象示例,
JSONObject paramObject = new JSONObject();
paramObject.put("key1", "value1");
paramObject.put("key1", "vaalue2");
现在将其传递为String
或JsonObject
@POST("URL")
fun apiName(@Body request: String); // pass as String
【讨论】:
我明白了。我终于明白了。谢谢老兄!以上是关于Android Kotlin Retrofit Post Request 输入的数据未发送的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Retrofit Android Kotlin 发布 [重复]
无法使用 Kotlin Retrofit 将数据从 Android 插入到 Mysql [重复]
Android Kotlin Retrofit + SimpleXMLConverter ElementList 解析不正确
android查询天气demo,基于mvp+kotlin+rxjava2+room+retrofit2