json swift cookies nsurlsession setcookie

json - ¿Cómo obtener una cookie de una NSURLSession con Swift?



cookies setcookie (5)

Consulta las respuestas anteriores, pero para Swift 3 querrás algo como esto:

var cookieProperties = [HTTPCookiePropertyKey:Any]() cookieProperties[HTTPCookiePropertyKey.name] = "foo" cookieProperties[HTTPCookiePropertyKey.value] = "bar" cookieProperties[HTTPCookiePropertyKey.path] = "baz" cookieProperties[HTTPCookiePropertyKey.domain] = ".example.com" let cookie = HTTPCookie(properties: cookieProperties)

Tengo una NSURLSession que llama a dataTaskWithRequest para enviar una solicitud POST de esta manera

func makeRequest(parameters: String, url:String){ var postData:NSData = parameters.dataUsingEncoding(NSASCIIStringEncoding)! var postLength:NSString = String(postData.length ) var request = NSMutableURLRequest(URL: NSURL(string: url)!) var session = NSURLSession.sharedSession() request.HTTPMethod = "POST" var error:NSError? //request.HTTPBody = NSJSONSerialization.dataWithJSONObject(postData, options: nil, error: &error) request.HTTPBody = postData request.setValue(postLength, forHTTPHeaderField: "Content-Length") request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Accept") var task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in println("Response:/(response)") // Other stuff goes here })

respuesta es igual a

<NSHTTPURLResponse: 0x7fcd205d0a00> { URL: http://XXX.XXX.XXX:0000/*** } { status code: 200, headers { "Cache-Control" = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"; Connection = close; "Content-Length" = 16; "Content-Type" = "application/json; charset=utf-8"; Date = "Mon, 13 Apr 2015 00:07:29 GMT"; Expires = "Thu, 19 Nov 1981 08:52:00 GMT"; Pragma = "no-cache"; Server = "Apache/2.2.15 (CentOS)"; "Set-Cookie" = "MYCOOKIEIS=12dsada342fdshsve4lorewcwd234; path=/"; "X-Powered-By" = "PHP/5.3.14 ZendServer/5.0"; } }

Mi problema aquí es que no sé cómo obtener la cookie que se encuentra en "Set-Cookie" con el nombre MYCOOKIEIS.

Usaré esto cuando el usuario inicie sesión. Si el usuario no ha iniciado sesión -> Iniciar sesión (llamar api de inicio de sesión). Si no, vaya a la pantalla de inicio y llame a otras API.

¿Alguien puede ayudarme a sacar la galleta de allí?

Encontré esta answer pero está en Objective-C y no sé cómo hacerlo con Swift

¡¡Gracias!!


La versión Swift podría verse algo como:

let task = session.dataTaskWithRequest(request) { data, response, error in if let httpResponse = response as? NSHTTPURLResponse, let fields = httpResponse.allHeaderFields as? [String : String] { let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(fields, forURL: response!.URL!) NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies, forURL: response!.URL!, mainDocumentURL: nil) for cookie in cookies { var cookieProperties = [String: AnyObject]() cookieProperties[NSHTTPCookieName] = cookie.name cookieProperties[NSHTTPCookieValue] = cookie.value cookieProperties[NSHTTPCookieDomain] = cookie.domain cookieProperties[NSHTTPCookiePath] = cookie.path cookieProperties[NSHTTPCookieVersion] = NSNumber(integer: cookie.version) cookieProperties[NSHTTPCookieExpires] = NSDate().dateByAddingTimeInterval(31536000) let newCookie = NSHTTPCookie(properties: cookieProperties) NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(newCookie!) print("name: /(cookie.name) value: /(cookie.value)") } } } task.resume()


Prueba este código:

guard let realResponse = response as? HTTPURLResponse, realResponse.statusCode == 200 else { print("Not a 200 response") return } let fields = realResponse.allHeaderFields as? [String :String] if let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields!, for: response!.url!) { for cookie in cookies { print("name: /(cookie.name) value: /(cookie.value)") } }


Swift 3/4, solución concisa:

let cookieName = "MYCOOKIE" if let cookie = HTTPCookieStorage.shared.cookies?.first(where: { $0.name == cookieName }) { debugPrint("/(cookieName): /(cookie.value)") }


Tuve el mismo problema: Esto obtiene, establece o elimina las cookies:

func showCookies() { let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage() //println("policy: /(cookieStorage.cookieAcceptPolicy.rawValue)") let cookies = cookieStorage.cookies as! [NSHTTPCookie] println("Cookies.count: /(cookies.count)") for cookie in cookies { var cookieProperties = [String: AnyObject]() cookieProperties[NSHTTPCookieName] = cookie.name cookieProperties[NSHTTPCookieValue] = cookie.value cookieProperties[NSHTTPCookieDomain] = cookie.domain cookieProperties[NSHTTPCookiePath] = cookie.path cookieProperties[NSHTTPCookieVersion] = NSNumber(integer: cookie.version) cookieProperties[NSHTTPCookieExpires] = cookie.expiresDate cookieProperties[NSHTTPCookieSecure] = cookie.secure // Setting a Cookie if let newCookie = NSHTTPCookie(properties: cookieProperties) { // Made a copy of cookie (cookie can''t be set) println("Newcookie: /(newCookie)") NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(newCookie) } println("ORGcookie: /(cookie)") } } func deleteCookies() { let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage() let cookies = cookieStorage.cookies as! [NSHTTPCookie] println("Cookies.count: /(cookies.count)") for cookie in cookies { println("name: /(cookie.name) value: /(cookie.value)") NSHTTPCookieStorage.sharedHTTPCookieStorage().deleteCookie(cookie) } //Create newCookie: You need all properties, because else newCookie will be nil (propertie are then invalid) var cookieProperties = [String: AnyObject]() cookieProperties[NSHTTPCookieName] = "locale" cookieProperties[NSHTTPCookieValue] = "nl_NL" cookieProperties[NSHTTPCookieDomain] = "www.digitaallogboek.nl" cookieProperties[NSHTTPCookiePath] = "/" cookieProperties[NSHTTPCookieVersion] = NSNumber(integer: 0) cookieProperties[NSHTTPCookieExpires] = NSDate().dateByAddingTimeInterval(31536000) var newCookie = NSHTTPCookie(properties: cookieProperties) println("/(newCookie)") NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookie(newCookie!) }