使用改造 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)
            }
        }
    }