2015-11-29 17 views
8

Próbuję czytać cookies odpowiedzi na żądania POST, jak zrobione przez Postman poniżejJak czytać ciasteczka odpowiedzi przy użyciu Alamofire

enter image description here

The Way I Am próbuje bez powodzenia teraz jest

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

Pierwsza instrukcja drukowania zawiera 10 pól nagłówka bez plików cookie, druga zawiera pustą tablicę.

Wszelkie pomysły?

+0

Czy kiedykolwiek to rozwiązałeś? Github Alamofire'a i zaakceptowana tu odpowiedź rozwiązują ten problem. Używam API innej firmy, w którym używają plików cookie do swoich sesji - ale nie mam pojęcia, jak je pobrać. –

+0

Proszę zobaczyć http://stackoverflow.com/a/41881600/2446178 dla poprawnej odpowiedzi –

Odpowiedz

19

Musisz wyodrębnić pliki cookie z odpowiedzi, używając metody NSHTTPCookiecookiesWithResponseHeaderFields(_:forURL:). Oto krótki przykład:

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

Wszystkie modyfikacje konfiguracji, które próbujesz wykonać, nie mają żadnego wpływu. Ustawione wartości są już wartościami domyślnymi.

+0

Niestety to nie działa dla mnie :(również drukowane puste pole – Tj3n

+1

Kiedykolwiek to wykombinować? Pliki cookie są zawsze puste. Wszystkie moje nagłówki są tam, z wyjątkiem Set-Cookie, ale Android może zobaczyć nagłówek Set-Cookie .... – lespommes

+0

@ cnoon Otrzymuję ten sam problem i używając powyższego kodu, ale otrzymuję 0 elementów w cookie, proszę o pomoc – Daljeet

0

@lespommes

Jest to jedyny sposób, w jaki otrzymaliśmy cookies. Teraz mogę wreszcie zobaczyć Set-Cookie w odpowiedzi:

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

Jeśli chcesz po prostu czytać wszystkie pliki cookie przeciwko domenie jesteś interakcji z, można uzyskać wszystkie pliki cookie z tej metody.

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

Zwraca opcjonalną tablicę z elementami NSHTTPCookie. (Swift 2.2 i Alamofire 3.4)

1

powyższy kod był poprawny użyłem w ten sposób -

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

Należy pamiętać, że przyjęte rozwiązanie nie działa, jeżeli cookies nie są publikowane w ramach odpowiedź nagłówka. Wygląda na to, że niektóre pliki cookie są pobierane wcześniej i przechowywane w udostępnionym pliku cookie sklepu i nie będą wyświetlane z odpowiedzią.

Zamiast tego należy użyć 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!) 
       } 
      } 
     } 

zasługa Travis M.

Powiązane problemy