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 发布者时