web-dev-qa-db-fra.com

Comment utiliser Alamofire 4 SessionManager?

J'utilisais Alamofire 3.4 dans Swift 2.3 et je dois mettre à jour mon code vers Swift 3 et Alamofire 4. J'utilisais Alamofire's Manager pour faire un POST dans une URL. J'ai lu la documentation sur SessionManager et je comprends que la demande utilise la méthode .GET.

J'utilisais Manager .Response () pour obtenir le rappel de la demande, maintenant c'est changé dans SessionManager.

Comment créer une méthode POST à l'aide de SessionManager? Et comment puis-je obtenir la réponse de la demande?

Voici mon code d'origine:

import UIKit
import AEXML
import Alamofire

class Request: NSObject {

    internal typealias RequestCompletion = (statusCode: Int?, error:NSError?) -> ()
    private var completionBlock: RequestCompletion!

    var serverTrustPolicy: ServerTrustPolicy!
    var serverTrustPolicies: [String: ServerTrustPolicy]!
    var afManager: Manager!

    func buildBdRequest(ip : String, serviceStr : String, completionBlock:RequestCompletion){
       let url = getURL(ip, service: serviceStr)
        configureAlamoFireSSLPinningWithCertificateData()
        makeAlamofireRequest(url)

        self.completionBlock = completionBlock
    }

    func makeAlamofireRequest(url : String){
        self.afManager.request(.POST, url)
            .validate(statusCode: 200..<300)
            .response { request, response, data, error in

                print("data - > \n    \(data.debugDescription) \n")
                print("response - >\n    \(response.debugDescription) \n")
                print("error - > \n    \(error.debugDescription) \n")

                var statusCode = 0

                if response != nil {
                    statusCode = (response?.statusCode)!
                }
                   self.completionBlock(statusCode: statusCode, error: error)
        }

    }


    private func getURL(ip : String, service: String) -> String{
        return ip + service;
    }

    func configureAlamoFireSSLPinningWithCertificateData() {
        self.serverTrustPolicies = [ :
            //            "github.com": self.serverTrustPolicy!
        ]

        self.afManager = Manager(
            configuration: NSURLSessionConfiguration.defaultSessionConfiguration()
        )
    }
}
18
yasin

J'ai migré votre code vers Swift 3 et Alamofire 4 et voici le résultat:

internal typealias RequestCompletion = (Int?, Error?) -> ()?
private var completionBlock: RequestCompletion!
var afManager : SessionManager!


func makeAlamofireRequest(url :String){
    let configuration = URLSessionConfiguration.default

    afManager = Alamofire.SessionManager(configuration: configuration)
    afManager.request(url, method: .post).validate().responseJSON {
                response in
                switch (response.result) {
                case .success:
                    print("data - > \n    \(response.data?.debugDescription) \n")
                    print("response - >\n    \(response.response?.debugDescription) \n")
                    var statusCode = 0
                    if let unwrappedResponse = response.response {
                        let statusCode = unwrappedResponse.statusCode
                    }
                    self.completionBlock(statusCode, nil)

                    break
                case .failure(let error):
                    print("error - > \n    \(error.localizedDescription) \n")
                    let statusCode = response.response?.statusCode
                    self.completionBlock?(statusCode, error)
                    break
                }
            }
}

Quelques notes sur le code:

Dans Alamofire 4.0, vous n'avez pas besoin de valider manuellement entre les codes 200..300. validate() la méthode le fait automatiquement.

Documentation :

Valide automatiquement le code d'état dans une plage de 200 à 299 et que l'en-tête Content-Type de la réponse correspond à l'en-tête Accept de la demande, le cas échéant.

Vous pouvez utiliser le paramètre response dans la méthode responseJSON. Il contient toutes les informations dont vous avez besoin dans votre code.

À propos de la méthode request

open func request(_ url: URLConvertible, method: HTTPMethod = .get, parameters: Parameters? = nil, encoding: ParameterEncoding = URLEncoding.default, headers: HTTPHeaders? = nil) -> DataRequest

Tous les paramètres, à l'exception de l'URL, sont initialement nuls ou ont une valeur par défaut. Il n'y a donc aucun problème à ajouter des paramètres ou des en-têtes à votre demande.

J'espère que cela vous aide

16
kamwysoc