【问题标题】:How to send array of object with form URL encoded through Retrofit Kotlin?如何使用通过 Retrofit Kotlin 编码的表单 URL 发送对象数组?
【发布时间】:2019-05-01 21:13:47
【问题描述】:

我想将表单 URL 编码发送到服务器,但参数需要对象数组

我尝试过使用 Retrofit 的 FieldMap 并传递数据,但是当我尝试使用 Postman 时得到不同的响应

参数需要传递

{
  "allowedStatus": "submit",
  "filters": [
    {
      "userId": "2"
    }
  ],
  "page": 1,
  "pageSize": 2
}

改造

@FormUrlEncoded
    @POST("ticket/status-list")
    fun getTicketStatusList(
        @Field("allowedStatus") allowedStatus: String,
        @FieldMap filters: HashMap<String, String>,
        @Field("page") page: Int,
        @Field("pageSize") pageSize: Int
    ): Observable<Response<TicketListModel>>

哈希映射

val filters = HashMap<String, String>()
        filters["userId"] = "1"
        Log.e("fieldMap", filters.toString())
        getTicketStatusList("monitoring", filters, 1, 5)

结果我得到 {},响应为 200

【问题讨论】:

  • 过滤器数组中的对象是不同的还是相同的?

标签: android kotlin retrofit2


【解决方案1】:

试试下面的方法:

data class Filters(var userId: String = "")

data class MyRequest(

        var allowedStatus: String = "",
        var filters: ArrayList<Filters>? = null,
        var page: Int = 0,
        var pageSize: Int = 0

        )

@POST("ticket/status-list")
fun getTicketStatusList(@Body request: MyRequest): Observable<Response<TicketListModel>>

【讨论】:

    【解决方案2】:

    请尝试这样:

    val filters = HashMap<String, RequestBody>()
    filters.put("userId", toRequestBody("2"))
    getTicketStatusList("monitoring", filters, 1, 5)
    

    还将“String”的哈希图更改为“RequestBody”

    @FormUrlEncoded
        @POST("ticket/status-list")
        fun getTicketStatusList(
            @Field("allowedStatus") allowedStatus: String,
            @FieldMap filters: HashMap<String, RequestBody>,
            @Field("page") page: Int,
            @Field("pageSize") pageSize: Int
        ): Observable<Response<TicketListModel>>
    

    下面的方法将String转换为RequestBody

    fun toRequestBody(value: String): RequestBody {
            return RequestBody.create(MediaType.parse("text/plain"), value)
    }
    

    【讨论】:

    • 请尝试“@FieldMap(encoded = true) 过滤器:HashMap,"
    • 还是一样的反应
    • 首先尝试将“Observable>”更改为“Observable”,如果它不起作用,则尝试使用映射而不是像“@FieldMap(encoded = true) 过滤器:Map,"
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多