2015-11-29 7 views
8

Sto cercando di leggere i cookie di risposta per una richiesta POST, come fatto da postino sottoCome leggere cookie di risposta utilizzando Alamofire

enter image description here

Il modo in cui sto provando senza successo in questo momento sta

var cfg = NSURLSessionConfiguration.defaultSessionConfiguration() 
    var cookies = NSHTTPCookieStorage.sharedHTTPCookieStorage() 
    cfg.HTTPCookieStorage = cookies 
    cfg.HTTPCookieAcceptPolicy = NSHTTPCookieAcceptPolicy.Always 

    var mgr = Alamofire.Manager(configuration: cfg) 


    mgr.request(.POST, "http://example.com/LoginLocalClient", parameters: parameters).responseJSON { response in 

       print(response.response!.allHeaderFields) 

       print(NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies) 
} 

La prima istruzione di stampa contiene i 10 campi di intestazione senza i cookie, il secondo contiene un array vuoto.

Qualche idea?

+0

Hai mai risolto questo? Il github di Alamofire e la risposta accettata qui risolvono questo problema. Sto usando un'API di terze parti in cui usano i cookie per le loro sessioni - ma non ho idea di come prenderli. –

+0

Si prega di vedere http://stackoverflow.com/a/41881600/2446178 per la risposta corretta –

risposta

19

È necessario estrarre i cookie dalla risposta utilizzando il metodo NSHTTPCookiecookiesWithResponseHeaderFields(_:forURL:). Ecco un breve esempio:

func fetchTheCookies() { 
    let parameters: [String: AnyObject] = [:] 

    Alamofire.request(.POST, "http://example.com/LoginLocalClient", parameters: parameters).responseJSON { response in 
     if let 
      headerFields = response.response?.allHeaderFields as? [String: String], 
      URL = response.request?.URL 
     { 
      let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headerFields, forURL: URL) 
      print(cookies) 
     } 
    } 
} 

Tutte le personalizzazioni di configurazione che si sta tentando di fare non avranno alcun effetto. I valori impostati sono già tutti predefiniti.

+0

purtroppo non funziona per me :(anche stampato campo vuoto – Tj3n

+1

mai capito questo I cookie sono sempre vuoti.Tutte le mie intestazioni ci sono eccetto Set-Cookie, eppure Android può vedere l'intestazione Set-Cookie .... – lespommes

+0

@cnoon Ho lo stesso problema e uso il codice sopra ma ottengo 0 elementi nel cookie, per favore aiutatemi. – Daljeet

0

@lespommes

Questo è l'unico modo che ho ricevuto i cookie. Ora posso finalmente vedere Set-Cookie in una risposta:

let parameters = ["postLogin": ["login": "[email protected]", "password": "myPassword"]] 

    let url = NSURL(string: "your-website-with-cookies.com") 

    let request = NSMutableURLRequest(URL: url!) 
    request.HTTPMethod = "POST" 
    request.setValue("application/json", forHTTPHeaderField: "Accept") 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: []) 

    Alamofire.request(request) 
     .responseJSON { response in 

      debugPrint(response) 

      if response.result.isSuccess { 
       ... 
       } 
      }else if (response.result.isFailure){ 
       ... 
      } 
    } 
0

Se si desidera solo per leggere tutti i cookie contro il dominio si interagisce con, è possibile ottenere tutti i cookie con questo metodo.

let cookies = Alamofire.Manager.sharedInstance.session.configuration.HTTPCookieStorage?.cookiesForURL(NSURL(string: "mydomain.com")!) 

restituisce un array opzionale di NSHTTPCookie elementi. (Swift 2.2 e Alamofire 3.4)

1

il codice di cui sopra è stato corretto che ho usato in questo modo -

var allCookies: [NSHTTPCookie]? 
     if let headerFields = aResponse.response?.allHeaderFields as? [String: String], 
      URL = aResponse.request?.URL { 
      allCookies = NSHTTPCookie.cookiesWithResponseHeaderFields(headerFields, forURL: URL) 
      for cookie in allCookies! { 
       print(cookie) 
       let name = cookie.name 
       if name == "nmSession" { 
        let value = cookie.value 
        print(value) 
       } 
      } 

     } 
8

prega di notare che la risposta accettata non funziona se i cookies non sono inviati entro il risposta all'intestazione. Apparentemente alcuni cookie vengono estratti in anticipo e memorizzati nel negozio di cookie condiviso e non verranno visualizzati con la risposta.

È necessario utilizzare HTTPCookieStorage.shared.cookies.

Swift 3:

 Alamofire.request(url, method: HTTPMethod.post, parameters: parameters).responseData { (responseObject) -> Void in 

      if let responseStatus = responseObject.response?.statusCode { 
       if responseStatus != 200 { 
        // error 
       } else { 
        // view all cookies 
        print(HTTPCookieStorage.shared.cookies!) 
       } 
      } 
     } 

merito va a Travis M.