当前位置:  开发笔记 > 编程语言 > 正文

从错误中获取服务器响应消息

如何解决《从错误中获取服务器响应消息》经验,为你挑选了3个好方法。

我的服务器(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.

有没有办法从故障处理程序访问此服务器消息?



1> 小智..:

根据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的情况下完成,在这里回答.

另一个清洁选项可能是编写自定义响应序列化程序.



2> SoftDesigner..:

路由器没有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))
        }
   }



3> BHuelse..:

我使用以下几行从Alamofire请求中读取响应正文。

    Alamofire.request(.POST, serveraddress, headers: headers, encoding: .JSON)
        .response{ request, response, data, error in
            let responseData = String(data: data!, encoding: NSUTF8StringEncoding)
            print(responseData)


    }

有了这个主体,我可以获得我的自定义服务器响应错误消息。

最好的祝福

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有