【问题标题】:Alamofire / AlamofireObjectMapper - How do I print error json from responseObject?Alamofire / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?
【发布时间】:2017-10-13 03:20:34
【问题描述】:
Alamofire.request(URL, method: Endpoints.login.method, parameters: parameters, encoding: JSONEncoding.default, headers: nil)
            .validate()
            .responseObject { [weak self] (response: DataResponse<User>) in
                switch response.result {
                case .success(let user):
                    cb(.success(user))
                case .failure(let error):
                    log.error(error)
                    cb(.failure(error))
                }
        }

如果我输入了错误的密码,那么我将无法打印 api 发送给我的确切错误消息。

po error.localizedDescription

我总是从 alamofire 收到默认消息,即“Response status code was unacceptable: 401.”。它应该打印像Invalid username and password 这样的动态错误消息。

顺便说一句,我可以使用 responseJson 来打印动态错误消息

.responseJSON { response in
                if response.response?.statusCode == 200 {
                    print("Success with JSON: \(response.result.value)")
                }
                else {
                    let error = response.result.value as! NSDictionary
                    let errorMessage = error.object(forKey: "message") as! String
                    print(errorMessage)
                }

但是我应该如何对responseObject 做同样的事情呢?

更新 1 -

参数

let parameters = [
            "username": userName,
            "password": password
        ]

回应

Login Response: {
    error =     {
    };
    message = "401 - {\"success\":false,\"message\":\"Invalid user/pass\"}";
}

【问题讨论】:

  • 你能告诉我们你的 API 的响应吗?除了标头,导致一些 API 开发人员喜欢将错误放在标头响应中。
  • @Glenn - 标头为零。我已经用参数和 api 响应更新了我的问题。因此,如果我删除 .validate() 那么它将进入成功案例,我可以在 response.result.value 中看到错误响应。但是如果我添加 .validate() 那么它会进入预期的失败情况,但是我无法打印服务器发送的错误响应。
  • @Tariq 嘿,我为此添加了一个答案,这应该可以帮助您了解在哪里寻找该错误响应,我自己在使用 Alamofire 时也遇到了类似的问题,这就是我的解决方法这个问题
  • 那么您需要从您的响应中解析message 数据。就是这样。
  • 然后我不能添加 case .failure(let error) 因为它永远不会在 responseObject 中执行。相反,我必须使用 responseJSON。我想为映射器使用 responseObject

标签: ios json parsing alamofire objectmapper


【解决方案1】:

你得到Response status code was unacceptable: 401.的原因是因为在调用请求时调用了.validate()方法,它的作用是检查响应代码应该在200...299的可接受范围内(根据Alamofire文档)

任何超出该范围的响应都会说状态码是不可接受的,但它不会丢弃从服务器发送的任何内容,它位于内部:

response.data

你必须自己解码:

let json = try? JSONSerialization.jsonObject(with: data, options: [])

这将为您返回 Any 的值或引发异常,请查看此苹果博客文章以获取更多信息:https://developer.apple.com/swift/blog/?id=37

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 2017-09-23
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多