2015-12-07 3 views
5

Мой сервер (CakePHP) реагирует следующим образом:Получить сообщение ответа сервера с ошибкой

$this->response->statusCode('400'); 
$this->response->type('json'); 
$this->response->body(json_encode(array('message' => 'Bookmark already exists'))); 

Выходной Почтальон выглядит так, как можно было бы ожидать:

{ «сообщение»: «Закладка уже существует» }

проблема заключается в том, что я не могу найти способ доступа это сообщение из обработчика ошибки (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, поскольку я просто получаю нуль, и результат возвращает только FAILURE.

Есть ли способ получить доступ к этому серверному сообщению от обработчика отказа?

+0

добавить вас Свифт код –

ответ

3

Я использовал следующие строки, чтобы прочитать тело ответа из запроса Alamofire.

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


    } 

С этим телом я могу получить свой пользовательский ответ об ошибке сервера.

наилучшими пожеланиями

11

Данные не разобраны в случае .Failure согласно Alamofire 3.0 migration guide. Однако данные сервера все еще доступны в файле 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, который обеспечивает JSON-структуру для преобразования NSData. Разбор NSData для JSON можно сделать без SwiftyJSON, ответил here.

Другим вариантом очистки может быть написать Custom Response Serializer.

+0

Спасибо, действительно спас мой день :) –

4

Метод с маршрутизатором и не 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)) 
     } 
    } 
Смежные вопросы