2015-02-15 11 views
25

Ho implementato una richiesta POST con Alamofire con un'intestazione personalizzata, perché lavoriamo con OAuth2 e dobbiamo inviare un token di accesso in ogni richiesta all'interno dell'intestazione. In questo caso devo usare un'intestazione personalizzata.Come utilizzare Alamofire con intestazioni personalizzate per la richiesta POST

Il valore del token di accesso per il campo dell'intestazione HTTP Authorization non funziona per me. Il server genera un errore perché le informazioni dell'intestazione per OAuth con il token di accesso non sono disponibili.

Ma qual è l'errore nel mio codice?

Ecco il mio codice corrente:

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)") 
    } 
+1

bella domanda !! –

+0

La risposta accettata sembra scaduta. Vedere la mia risposta qui: http://stackoverflow.com/a/40000918/2594699 –

risposta

37

Ecco un esempio di come Io lo uso con intestazioni:

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" 
    ] 

Ora ogni volta che si effettua una richiesta, si userà le intestazioni specificate .

Il codice refactoring: ricordarsi di 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)") 
    } 

Questo è richiesta la firma request(method: Method, URLString: URLStringConvertible>, parameters: [String : AnyObject]?, encoding: ParameterEncoding)

Come si può vedere non c'è bisogno di passare un NSURL in esso, solo la stringa dell'URL Alamofire si prende cura di tutto il resto.

+0

Per la richiesta funzionerà, ma la risposta non funziona più. Puoi vedere: http://stackoverflow.com/questions/25143938/how-to-use-alamofire-with-custom-headers – Karl

+0

Questo è il nuovo modo di farlo e funziona. Leggi la sezione Vecchie risposte da quel link, controlla anche: https://github.com/Alamofire/Alamofire/issues/111 - Mattt stesso dice 'Usa la proprietà HTTPAdditionalHeaders' – leonarth

+0

Riforterà il tuo codice in modo che possa funzionare e pubblicarlo. – leonarth

2

C'è una soluzione semplice per inviare i parametri e di testa con una singola richiesta Alamofire per Swift 3 e 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 
     } 
    }