【问题标题】:Trouble posting json array within a json object with retrofit2使用retrofit2在json对象中发布json数组时遇到问题
【发布时间】:2020-11-18 21:55:27
【问题描述】:

在 api 中,我必须在 JSonObject 中发送 JSonArrayJSonObject 是这样的:

{
    "token" : "1",
    "task_name" : "Name",
    "task_desc" : "Description",
    "task_start_date" : "2020/10/01",
    "task_end_date" : "2020/10/02",
    "task_award" : "15",
    "child_ids" : [
          {
              "child_id" : "1"
          },
          {
              "child_id" : "2"
          }
      ]
}

当我使用 Postman 发送此请求时,它工作正常,并且以我想要的方式接收响应。但是在android应用程序中实现它时,我收到一条错误消息:

retrofit2.adapter.rxjava2.httpexception http 500 internal server error

所以很明显这不是服务器端错误,因为它在 Postman 中运行良好。

这是我用于 api 的接口:

interface CreateTaskRemote {

    @FormUrlEncoded
    @POST("parent_create_task")
    fun createTask(
        @Field("token") parentToken: String,
        @Field("task_name") title: String,
        @Field("task_desc") description: String,
        @Field("task_start_date") startDate: String,
        @Field("task_end_date") endDate: String,
        @Field("task_award") award: String,
        @Field("child_ids") childIds: List<ChildId>     <-- here i'm sending array
    ): Single<BooleanResponse>
}

还有 ChildId 类:

data class ChildId(
    @SerializedName("child_id") val id: Int
)

似乎在实现 JSON 数组时存在错误。但是我在互联网上搜索了很多,我找不到适合我情况的解决方案。

【问题讨论】:

  • 您是否尝试过记录您发送的 json 字符串并检查其结构?
  • @jamesyoung 我喜欢记录它。但是我如何记录改造正在生成的 json?

标签: android json retrofit retrofit2


【解决方案1】:

也许原因是您将child_id 发布为整数值,但您应该将其发布为字符串。 (关于:"child_id" : "1"

data class ChildId(
    @SerializedName("child_id") val id: String
)

编辑: 也试试这个配置:

data class CreateTaskArgs (
    @SerializedName("token") val token : Int,
    @SerializedName("task_name") val taskName : String,
    @SerializedName("task_desc") val taskDesc : String,
    @SerializedName("task_start_date") val taskStartDate : String,
    @SerializedName("task_end_date") val taskEndDate : String,
    @SerializedName("task_award") val taskAward : Int,
    @SerializedName("child_ids") val childIds : List<ChildId>
)
@POST("parent_create_task")
fun createTask(
    @Body args: CreateTaskArgs
): Single<BooleanResponse>

【讨论】:

  • 我把它改成了字符串。但似乎服务器正在将 Int 转换为 String。问题依然存在
  • 我在 Json 对象中声明 JSon 数组是不是搞错了?
  • 尝试使用@Body 发送变量,而不是使用@FormUrlEncoded
  • 我刚做了,效果很好!!太感谢了。但是你能告诉我这两种方式有什么区别吗?
  • Post方法中的参数通过消息体携带,所以在改造中,我们使用这个结构和@Body来填充消息体。
猜你喜欢
  • 2021-06-29
  • 2013-02-16
  • 2020-10-25
  • 2023-03-06
  • 2018-08-28
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多