Alamofire / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?

Posted

技术标签:

【中文标题】Alamofire / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?【英文标题】:Alamofire / AlamofireObjectMapper - How do I print error json from responseObject? 【发布时间】: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 【参考方案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

【讨论】:

以上是关于Alamofire / AlamofireObjectMapper - 如何从 responseObject 打印错误 json?的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire:responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.inputData

出现错误:使用 Alamofire.playground 时没有这样的模块“Alamofire”

var 请求:Alamofire.Request?使用未声明类型的 Alamofire

值:(failure(Alamofire.AFError.explicitlyCancelled)) 使用 Alamofire 发布者时

使用方案 Alamofire watchOS 构建工作区 Alamofire 失败

iOS开发之Alamofire源码深度解析