Tengo un NSURLSession que llama dataTaskWithRequest con el fin de enviar una solicitud POST de este modo

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 hay en «Set-Cookie», con el nombre de MYCOOKIEIS.

Voy a usar esto cuando el inicio de Sesión de usuario Si el usuario no ha iniciado sesión en -> inicio de Sesión (llamada de inicio de sesión api) de otra Persona para que Vaya a la pantalla de inicio y llamar a otras Api.

Alguien me puede ayudar a obtener la cookie de allí?

He encontrado este respuesta pero es en Objective-C y no sé cómo hacerlo con Swift

5 Comentarios

  1. 42

    La rápida interpretación podría ser algo como:

    let task = session.dataTask(with: request) { data, response, error in
        guard
            let url = response?.url,
            let httpResponse = response as? HTTPURLResponse,
            let fields = httpResponse.allHeaderFields as? [String: String]
        else { return }
    
        let cookies = HTTPCookie.cookies(withResponseHeaderFields: fields, for: url)
        HTTPCookieStorage.shared.setCookies(cookies, for: url, mainDocumentURL: nil)
        for cookie in cookies {
            var cookieProperties = [HTTPCookiePropertyKey: Any]()
            cookieProperties[.name] = cookie.name
            cookieProperties[.value] = cookie.value
            cookieProperties[.domain] = cookie.domain
            cookieProperties[.path] = cookie.path
            cookieProperties[.version] = cookie.version
            cookieProperties[.expires] = Date().addingTimeInterval(31536000)
    
            let newCookie = HTTPCookie(properties: cookieProperties)
            HTTPCookieStorage.shared.setCookie(newCookie!)
    
            print("name: \(cookie.name) value: \(cookie.value)")
        }
    }
    task.resume()
    • No olvide eliminar las cookies cuando se realiza algún tipo de «cerrar sesión». Compruebe @Mellian respuesta a continuación
    • Recuerde que algunas de las cookies no aparecen debajo de la httpResponse.allHeaderFields. Usted tendrá que usar el almacén de cookies iOS proporciona en su lugar.
    • Lo entiendo, pero lo que si quiero establecer el valor de la cookie , por ejemplo JSESSIONID, antes de la ejecución de la tarea?
  2. 11

    Yo tenía el mismo problema: Esta se presenta, establece o eliminar 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!)
    }
  3. 8

    Swift 3/4, concisa solución:

    let cookieName = "MYCOOKIE"
    if let cookie = HTTPCookieStorage.shared.cookies?.first(where: { $0.name == cookieName }) {
    debugPrint("\(cookieName): \(cookie.value)")
    }
    • Gracias, Simple y fácil!
    • Para swift 4, este funciona a la perfección !
  4. 7

    Ver 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)
  5. -1

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

Dejar respuesta

Please enter your comment!
Please enter your name here