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()
)
}
}
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.
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