J'ai implémenté une demande POST avec Alamofire
avec un en-tête personnalisé, car nous travaillons avec OAuth2 et nous devons envoyer un jeton d'accès à chaque demande dans l'en-tête. Dans ce cas, je dois utiliser un en-tête personnalisé.
La valeur du jeton d'accès pour le champ d'en-tête HTTP Authorization
ne fonctionne pas pour moi. Le serveur génère une erreur car les informations d'en-tête pour OAuth avec le jeton d'accès ne sont pas disponibles.
Mais quelle est l'erreur dans mon code?
Voici mon code actuel:
let URL = NSURL(string: url + "/server/rest/action")
var mutableURLRequest = NSMutableURLRequest(URL: URL!)
mutableURLRequest.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
//this method does not work anymore because it returns an error in the response
//Alamofire.Manager.sharedInstance.session.configuration.HTTPAdditionalHeaders = ["Authorization": "Bearer \(accessToken)"]
Alamofire.Manager.sharedInstance
.request(.POST, mutableURLRequest, parameters: parameters, encoding: .JSON)
.validate()
.responseJSON {
(request, response, data, error) -> Void in
NSLog("REQUEST: \(request)")
NSLog("RESPONSE: \(response)")
NSLog("DATA: \(data)")
NSLog("ERROR: \(error)")
}
Voici un exemple de mon utilisation avec des en-têtes personnalisés:
var manager = Manager.sharedInstance
// Specifying the Headers we need
manager.session.configuration.HTTPAdditionalHeaders = [
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "application/vnd.lichess.v1+json",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "iMchess"
]
Désormais, chaque fois que vous ferez une demande, les en-têtes spécifiés seront utilisés.
Votre code refactored: N'oubliez pas de import Alamofire
let aManager = Manager.sharedInstance
manager.session.configuration.HTTPAdditionalHeaders = [
"Authorization": "Bearer \(accessToken)" ]
let URL = url + "/server/rest/action"
request(.POST, URL, encoding: .JSON)
.responseJSON {
(request, response, data, error) -> Void in
println("REQUEST: \(request)")
println("RESPONSE: \(response)")
println("DATA: \(data)")
println("ERROR: \(error)")
}
Ceci est la demande de signature request(method: Method, URLString: URLStringConvertible>, parameters: [String : AnyObject]?, encoding: ParameterEncoding)
Comme vous pouvez le constater, il n’est pas nécessaire de passer un NSURL, mais uniquement la chaîne de l’URL, Alamofire se charge du reste.
Il existe une solution simple pour envoyer des paramètres et un en-tête avec une seule demande Alamofire pour Swift 3 et Alamofire 4.0.
let url = "myURL"
let parameters: Parameters = [
"param1": "hello",
"param2": "world"
]
let headers = [
"x-access-token": "myToken",
]
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON { (response) in
if response.result.isFailure {
//In case of failure
}else {
//in case of success
}
}
let headers: HTTPHeaders = [
"Cookie": UserDefaultsUtil.getString(param: Constants.COOKIE),
"Accept": "application/json"
]
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
.responseObject { (response: DataResponse<Any>) in
if response.result.isSuccess {
}
else {
}
}