我的服务器(CakePHP)响应如下:
$this->response->statusCode('400'); $this->response->type('json'); $this->response->body(json_encode(array('message' => 'Bookmark already exists')));
邮差输出看起来像你期望的那样:
{"message":"书签已存在"}
问题是我找不到从失败处理程序访问此消息的方法(Alamofire 3.1.3 + SwiftyJSON 2.3.2)
Alamofire.request(.POST... .validate() .responseJSON { response in switch response.result { case .Success(_): // All good case .Failure(let error): // Status code 400 print(response.request) // original URL request print(response.response) // URL response print(response.data) // server data print(response.result)
我找不到一种方法将response.data转换为JSON,因为我只是得到nil,结果只返回FAILURE.
有没有办法从故障处理程序访问此服务器消息?
根据Alamofire 3.0迁移指南,未在.Failure案例中解析数据.但是,服务器数据仍然可以在response.data中使用,并且可以进行解析.
下面应该可以手动解析:
Alamofire.request(.POST, "https://example.com/create", parameters: ["foo": "bar"]) .validate() .responseJSON { response in switch response.result { case .Success: print("Validation Successful") case .Failure(_): var errorMessage = "General error message" if let data = response.data { let responseJSON = JSON(data: data) if let message: String = responseJSON["message"].stringValue { if !message.isEmpty { errorMessage = message } } } print(errorMessage) //Contains General error message or specific. } } }
这使用SwiftyJSON,它提供转换NSData的JSON结构.解析NSData到JSON可以在没有SwiftyJSON的情况下完成,在这里回答.
另一个清洁选项可能是编写自定义响应序列化程序.
路由器没有SwiftyJSON的方法:
Alamofire.request(APIRouter.Register(params: params)).validate().responseJSON { response in switch response.result { case .Success(let json): let message = json["clientMessage"] as? String completion(.Success(message ?? "Success")) case .Failure(let error): var errorString: String? if let data = response.data { if let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []) as! [String: String] { errorString = json["error"] } } completion(.Error(errorString ?? error.localizedDescription)) } }
我使用以下几行从Alamofire请求中读取响应正文。
Alamofire.request(.POST, serveraddress, headers: headers, encoding: .JSON) .response{ request, response, data, error in let responseData = String(data: data!, encoding: NSUTF8StringEncoding) print(responseData) }
有了这个主体,我可以获得我的自定义服务器响应错误消息。
最好的祝福