【问题标题】:Alamofire parse response incorrectlyAlamofire 解析响应不正确
【发布时间】:2023-02-01 07:54:41
【问题描述】:

在 Postman 上尝试请求,响应的“数据”是一个空字典。

但是,当我使用 Alamofire 快速尝试时,“数据”被误解为空数组。我做错了什么?

使用 debugPrint(response) 的原始响应打印以下内容:

[Response]:
    [Status Code]: 200
    [Headers]:
        Access-Control-Allow-Origin: *
        Alt-Svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, quic=":443"; ma=2592000; v="43,46"
        Cache-Control: no-cache, private
        Content-Encoding: br
        Content-Length: 71
        Content-Type: application/json
        Date: Tue, 31 Jan 2023 16:32:18 GMT
        Vary: Accept-Encoding
        x-powered-by: PHP/8.0.24
        x-ratelimit-limit: 60
        x-ratelimit-remaining: 59
    [Body]:
        {"status":false,"message":"Kullan\u0131c\u0131 bilgileri hatal\u0131.","data":[]}

尝试更改请求的编码和标头,但无济于事。

【问题讨论】:

  • 我建议放弃 Alamofire,转而使用 URLSessionCodable
  • 并且请将文字作为实际文字发布,而不是图片。
  • "from: ..." 显示它是一个数组,这似乎是您收到的原始 JSON ...
  • 你能打印String(data: response.data, encoding: .utf8)吗?那应该是你得到的原始 JSON,在我看来它是一个数组,而不是字典。
  • @Larme,它是一个数组。 Optional("{\"status\":false,\"message\":\"Kullan\\u0131c\\u0131 bilgileri hatal\\u0131.\",\"data\":[]}")。我不明白的是,为什么它是关于邮递员的字典?我们的 Android 团队也没有问题。

标签: json swift api rest alamofire


【解决方案1】:

这不是 Alamofire 问题,这是来自 JSONDecoder 的错误。您可以通过在 Alamofire 中打印原始响应(您没有发布任何代码)来检查您的实际响应。

.response<...> { response in 
  debugPrint(response)
}

这将打印一个 String 版本的响应正文(除非它非常大),您可以使用它来查看您实际收到的内容。

您还可以使用像 Proxyman 这样的代理或像 Wireshark 这样的流量检查器来检查您的实际响应,看看您实际得到了什么。看来您实际上正在接收一个数组。

【讨论】:

  • 谢谢,更新了我的问题。
  • 这似乎缺少问题。 OP 在一个上下文中显示 data 字段是字典,但在运行的应用程序中通过 Alamofire 接收的 JSON 将 data 字段作为数组。问题是关于这种意想不到的差异。
  • @HangarRash 最初的问题是为什么在需要字典时却说有一个数组。原来它实际上是一个数组。现在问题是为什么它是一个数组。这是后端的一个新问题。
【解决方案2】:

我遇到过这种从服务器 (openweathermap) 表示 null 的奇怪方式,它使用 {} 而不是 nilnull。 为此,我使用了自定义解码器,例如:

// for the case where we have:  "data": { } instead of say, "data": null

public init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    if let theData = try? values.decode([String].self, forKey: .data) {
        self.data = theData
    } else {
        self.data = nil
    }
    // ....other keys
}

带有声明,let data: [String]? 或数组包含的任何内容。

请注意,这是 JSONDecoder 行为,而不是 Alamofire,我使用的是 URLSession.shared...

【讨论】:

    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 2021-07-22
    • 2018-09-14
    • 2016-01-09
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多