3 votes

Alamofire: gérer les erreurs avec une réponse réussie

Salut, je suis encore nouveau sur Alamofire et json. Je voudrais simplement demander comment gérer une erreur sur une réponse réussie. Voici la réponse de l'api avec une requête post.

{
data =     {
    "cabinet_id" = 3289146811;
    "created_at" = "2018-04-11T04:53:43.288023001Z";
    "user_id" = 123abc;
};
}

Mais parfois, je reçois une réponse comme ci-dessous en raison d'une erreur serveur

{
error =     {
    "http_status_code" = 400;
    message = "Impossible de procéder";
    type = "rent_request_failed";
};
}

Voici ce que j'ai fait

let url = "myurl"
let parameters = ["user_id": ""\(self.idPassed)"",
                          "cabinet_id": "\(self.stringPassed)"]

        Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default).responseJSON { response in

                if (response.result.isSuccess){

                    if let value = response.result.value {
//maintenant le succès ou l'échec mènera toujours ici                            
Helper.helper.switchToNavigationViewController(Navigation: "hundredpercent")
                        print(value)

                    }
                //faites vos manipulations json
                } else if (response.result.isFailure) {
                //Gérez votre erreur
                switch (response.error!._code){
                case NSURLErrorTimedOut:
                //Gérez votre erreur de délai d'attente
                break
                case NSURLErrorNotConnectedToInternet:
                //Gérez votre erreur de non connexion à internet
                break
                default:
                    let alertt = UIAlertController(title: "Erreur serveur!", message: "Veuillez réessayer", preferredStyle: .alert)

                    alertt.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction!) in
//besoin de naviguer ici en cas d'erreur                        
Helper.helper.switchToNavigationViewController(Navigation: "qrcodescan")

                    }))

                    self.present(alertt, animated: true)
                }
                }
        }

10voto

Ankit Jayaswal Points 3477

Valider le code d'état de la réponse lors de l'appel de l'API en ajoutant validate(statusCode: 200..<299) sur la requête alamofire.

Cela validera le succès si le code d'état http se situe dans l'intervalle 200-299 sinon cela ira dans le cas d'échec.

        // Appeler la méthode de gestion de la réponse d'alamofire
        Alamofire.request(url, method: .post, parameters: parameters, encoding: URLEncoding.default).validate(statusCode: 200..<299).responseJSON(completionHandler: { response in

            switch response.result {
            case .success(let data): 
                Logs.DLog(object: "\n Succès: \(response)")

                // Faites votre code ici...

            case .failure(let error):
                Logs.DLog(object: "\n Échec: \(error.localizedDescription)")

                // Faites votre code ici...

            }
        })

1voto

isuru madusanka Points 11

C'est une façon dont j'ai utilisé pour gérer la réponse. J'espère que cela vous aidera.

class func Request(statusCallBack: @escaping (_ statusCode: Int) -> Void, successCallback: @escaping (_ result: AnyObject) -> Void, errorCallback: @escaping (_ error: Error) -> Void) {

Alamofire.request(url, method: method, parameters: params, encoding: encodingType, headers: headers).responseJSON { (responce) in

        // Ici, vérification du code d'état de la réponse
        if let status = responce.response?.statusCode {
            if status == 401 && AppUserDefault.getAccessToken() != nil {
                User.logout()
                return
            }
            statusCallBack(status)
        }
        switch responce.result {
        case .success(_):
            if let result = responce.result.value {
                successCallback(result as AnyObject)
            } else {
                errorCallback(NSError(domain: "Erreur de serveur interne", code: 1002, userInfo: nil))
            }
            break
        case .failure(let error) :
            errorCallback(error)
            break
        }
    }
}

0voto

Naren Krish Points 179

Utilisez SwiftyJSON et essayez quelque chose comme ceci

  switch response.result {
  case .success:
    if let value = response.result.value {
      let json = JSON(value)
      if ( response.response!.statusCode == 200 || response.response!.statusCode == 201) {
        let localStatusCode = json["status"].intValue

        if localStatusCode >= 400 {
          if json["errors"] != JSON.null{
            callback(json["errors"].stringValue, nil)
          }else{
              callback(json["message"].stringValue, nil)
          }
        }else {
          callback(nil, json)
        }
      }else if response.response?.statusCode != 200 {
        callback(json["error"].stringValue, nil)
      }
    }
  case .failure(let error):

    NSLog("Echec \(error),\(urlString)")

    if(response.response?.statusCode == 401){

    }
    if  let errorStr = response.data {
      let errorJson = JSON(errorStr)
      if(errorJson != JSON.null){
        if errorJson["error"] != JSON.null{
          callback(errorJson["error"].stringValue, nil)
        }else{
          callback(errorJson["message"].stringValue, nil)
        }
      }else {
        callback(error.localizedDescription,nil)
      }
    }else {
      callback("Erreur de connexion au serveur", nil)
    }
  }
})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X