web-dev-qa-db-fra.com

Comment utiliser Alamofire avec des en-têtes personnalisés pour POST demande

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)")
    }
28
Karl

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.

42
leonarth

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
        }
    }
4
Kevin ABRIOUX
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 {

            }
    }
0
Deepak Kadarivel