使用改造 2 和 moshi post 的正确方法是什么
What is the right way to post with retrofit 2 and moshi
我一直在尝试使用 Retrofit 2 和 Moshi 制作 POST,但我无法让它工作。
我的数据 类 如下所示:
data class Order(
val items: List<Item>?,
val customerName: String,
val customerPhoneNo: String,
val customerAddress: String,
val note: String
)
data class Item(
val productUid: String,
var quantity: Int
)
界面是这样的
interface ProductService {
@POST("/api/order/saveorder")
suspend fun postProds(
@Field("customerName") customerName: String,
@Field("customerPhoneNo") customerPhone: String,
@Field("customerAddress") address: String,
@Field("note") customerNote:String,
@Field("items") orderItems: List<Item>
): Response<Order>
@GET("/api/product/allproducts")
suspend fun getProds(): Response<List<ProdsItem>>
}
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
object Network {
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi)
.asLenient()
)
.build()
object ProdsApi {
val retrofitService: ProductService by lazy {
retrofit.create(ProductService::class.java)
}
}
}
postProds 函数是这样调用的:
suspend fun sendOrder(order: Order) {
withContext(Dispatchers.Main){
try {
val orderResponse = Network.ProdsApi.retrofitService.postProds(
order.customerName,
order.customerPhoneNo,
order.customerAddress,
order.note,
order.items )
}
catch (e: Exception) {
Timber.e(e)
}
}
}
尝试POST这种方式不断产生这样的回应:
Response{protocol=h2, code=400, message=, url=
但是,我尝试在我的 viewModel 中直接将 Order 对象转换为 json,如下所示:
val moshi: Moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter: JsonAdapter<Order> = moshi.adapter(Order::class.java)
val jsonString = jsonAdapter.toJson(customerOrder)
Timber.d(jsonString)
然后我在 Postman 上测试了生成的 jsonString 并得到了 200 响应。
我需要一些帮助来找出我在代码中做错了什么。
在邮递员中,您在请求正文中发送数据。但是在您的代码中,它会作为 key-value 参数。尝试从您的代码中将其发送到正文中。试试下面的代码片段。
更新您的订单数据class:
@JsonClass(generateAdapter = true)
data class Order(
@Json(name = "items")
val items: List<Item>?,
@Json(name = "customerName")
val customerName: String,
@Json(name = "customerPhoneNo")
val customerPhoneNo: String,
@Json(name = "customerAddress")
val customerAddress: String,
@Json(name = "note")
val note: String
)
@JsonClass(generateAdapter = true)
data class Item(
@Json(name = "productUid")
val productUid: String,
@Json(name = "quantity")
var quantity: Int
)
现在是 ProductService 接口:
interface ProductService {
@POST("/api/order/saveorder")
suspend fun postProds(
@Body request: Order
): Response<Order>
@GET("/api/product/allproducts")
suspend fun getProds(): Response<List<ProdsItem>>
}
现在在您的函数调用中传递请求对象:
suspend fun sendOrder(order: Order) {
withContext(Dispatchers.Main){
try {
val orderResponse = Network.ProdsApi.retrofitService.postProds(order)
}
catch (e: Exception) {
Timber.e(e)
}
}
}
我一直在尝试使用 Retrofit 2 和 Moshi 制作 POST,但我无法让它工作。 我的数据 类 如下所示:
data class Order(
val items: List<Item>?,
val customerName: String,
val customerPhoneNo: String,
val customerAddress: String,
val note: String
)
data class Item(
val productUid: String,
var quantity: Int
)
界面是这样的
interface ProductService {
@POST("/api/order/saveorder")
suspend fun postProds(
@Field("customerName") customerName: String,
@Field("customerPhoneNo") customerPhone: String,
@Field("customerAddress") address: String,
@Field("note") customerNote:String,
@Field("items") orderItems: List<Item>
): Response<Order>
@GET("/api/product/allproducts")
suspend fun getProds(): Response<List<ProdsItem>>
}
private val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
object Network {
private val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(MoshiConverterFactory.create(moshi)
.asLenient()
)
.build()
object ProdsApi {
val retrofitService: ProductService by lazy {
retrofit.create(ProductService::class.java)
}
}
}
postProds 函数是这样调用的:
suspend fun sendOrder(order: Order) {
withContext(Dispatchers.Main){
try {
val orderResponse = Network.ProdsApi.retrofitService.postProds(
order.customerName,
order.customerPhoneNo,
order.customerAddress,
order.note,
order.items )
}
catch (e: Exception) {
Timber.e(e)
}
}
}
尝试POST这种方式不断产生这样的回应:
Response{protocol=h2, code=400, message=, url=
但是,我尝试在我的 viewModel 中直接将 Order 对象转换为 json,如下所示:
val moshi: Moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
val jsonAdapter: JsonAdapter<Order> = moshi.adapter(Order::class.java)
val jsonString = jsonAdapter.toJson(customerOrder)
Timber.d(jsonString)
然后我在 Postman 上测试了生成的 jsonString 并得到了 200 响应。
我需要一些帮助来找出我在代码中做错了什么。
在邮递员中,您在请求正文中发送数据。但是在您的代码中,它会作为 key-value 参数。尝试从您的代码中将其发送到正文中。试试下面的代码片段。
更新您的订单数据class:
@JsonClass(generateAdapter = true)
data class Order(
@Json(name = "items")
val items: List<Item>?,
@Json(name = "customerName")
val customerName: String,
@Json(name = "customerPhoneNo")
val customerPhoneNo: String,
@Json(name = "customerAddress")
val customerAddress: String,
@Json(name = "note")
val note: String
)
@JsonClass(generateAdapter = true)
data class Item(
@Json(name = "productUid")
val productUid: String,
@Json(name = "quantity")
var quantity: Int
)
现在是 ProductService 接口:
interface ProductService {
@POST("/api/order/saveorder")
suspend fun postProds(
@Body request: Order
): Response<Order>
@GET("/api/product/allproducts")
suspend fun getProds(): Response<List<ProdsItem>>
}
现在在您的函数调用中传递请求对象:
suspend fun sendOrder(order: Order) {
withContext(Dispatchers.Main){
try {
val orderResponse = Network.ProdsApi.retrofitService.postProds(order)
}
catch (e: Exception) {
Timber.e(e)
}
}
}