2016-01-12 8 views
12

Mam dość prosty scenariusz, z którym walczę. Używam Alamofire do zarejestrowania użytkownika na API odpoczynku. Pierwsze połączenie z rejestracją zakończyło się pomyślnie i użytkownik może się zalogować. Drugie połączenie, próbując zarejestrować się przy użyciu tego samego adresu e-mail, powinno spowodować przesłanie kodu statusu HTTP 409 z serwera. Alamofire zwraca jednak .Success z pustym żądaniem i odpowiedzią. Przetestowałem to to API z listonoszem i poprawnie zwraca 409.Alamofire wraca. Sukces przy błędzie Kody statusu HTTP

Dlaczego Alamofire nie wraca .Failure (błąd), gdzie błąd ma informację o kodzie stanu itp?

Oto wywołanie, które uruchamiam z tym samym wejściem za każdym razem.

Alamofire.request(.POST, "http://localhost:8883/api/0.1/parent", parameters: registrationModel.getParentCandidateDictionary(), encoding: .JSON).response(completionHandler: { (req, res, d, e) -> Void in 
     print(req, res, d, e) 
    }) 

Odpowiedz

41

Z Alamofire manual:

Validation

Domyślnie Alamofire traktuje każdy wypełniony wniosek, by odnieść sukces, niezależnie od treści odpowiedzi. Wywołanie sprawdzania przed obsługi odpowiedź powoduje błąd zostać wygenerowany, jeżeli odpowiedź miał niedopuszczalne kod stanu lub typu MIME.

można ręcznie sprawdzić poprawność kodu statusu za pomocą metody validate znowu z podręcznika:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) 
    .validate(statusCode: 200..<300) 
    .validate(contentType: ["application/json"]) 
    .response { response in 
     print(response) 
    } 

Albo można półautomatycznie walidacji kodu stanu i typ zawartości za pomocą validate z NO argumenty:

Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"]) 
    .validate() 
    .responseJSON { response in 
     switch response.result { 
     case .success: 
      print("Validation Successful") 
     case .failure(let error): 
      print(error) 
     } 
    } 
+1

Link do strony podręcznika prowadzi do Alamofire głównej. Prawidłowa: [Sprawdzanie poprawności] (https://github.com/Alamofire/Alamofire/blob/master/Documentation/Usage.md#response-validation) –

+0

Zaktualizowano link. Dzięki @andriy_fedin –

6

przypadku korzystania response można sprawdzić parametr NSHTTPURLResponse:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default) 
    .response { response in 
     if response.response?.statusCode == 409 { 
      // handle as appropriate 
     } 
} 

Domyślnie 4xx kody stanu nie są traktowane jako błędy, ale można użyć validate ją leczyć jako takie, a następnie złożyć go w szerszym obsługi błędów:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default) 
    .validate() 
    .response() { response in 
     guard response.error == nil else { 
      // handle error (including validate error) here, e.g. 

      if response.response?.statusCode == 409 { 
       // handle 409 here 
      } 
      return 
     } 
     // handle success here 
} 

Lub, jeśli stosując responseJSON:

Alamofire.request(urlString, method: .post, parameters: registrationModel.getParentCandidateDictionary(), encoding: JSONEncoding.default) 
.validate() 
.responseJSON() { response in 
    switch response.result { 
    case .failure: 
     // handle errors (including `validate` errors) here 

     if let statusCode = response.response?.statusCode { 
      if statusCode == 409 { 
       // handle 409 specific error here, if you want 
      } 
     } 
    case .success(let value): 
     // handle success here 
     print(value) 
    } 
} 

powyżej jest Alamofire 4.x. Zobacz poprzednie wydanie tej odpowiedzi dla earlier versions of Alamofire.

+0

Linia 'jeśli statusCode == 409 409 {// uchwyt specyficzny błąd tutaj, jeśli chcesz}' - Co byłoby najlepszym sposobem, aby pobrać komunikat o błędzie po stronie serwera? np. błąd zwracania 401 i serwer informujący użytkownika, że ​​dane logowania są nieprawidłowe. Jaka jest najlepsza praktyka? – luke

+1

@luke - Zwykle po prostu korzystasz z kodu statusu. Usługi sieciowe często zawierają trochę tekstu w treści odpowiedzi (np. W Alamofire 4.x, w odpowiedzi.data "), ale AFAIK format tego nie jest ustandaryzowany, więc musisz sprawdzić odpowiedź z konkretnego serwera i zobaczyć, co możesz sparsować, jeśli w ogóle. Jeśli nie chcesz tego wszystkiego przeglądać, możesz po prostu spojrzeć na sam kod "statusCode". Przy okazji, zauważ, że nie wszystkie błędy uwierzytelnienia powodują kod statusu 401, ale raczej powodują błąd i musisz spojrzeć na 'kod' obiektu' Error'. – Rob

Powiązane problemy