2015-04-13 166 views
18

我有,为了以这种方式发送POST请求如何使用Swift从NSURLSession获取cookie?

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 

}) 

响应呼吁dataTaskWithRequest一个NSURLSession等于:

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

我这里的问题是,我不知道该怎么获取名为MYCOOKIEIS的“Set-Cookie”中的cookie。

我将在用户登录时使用此so如果用户未登录 - >登录(call login api)否则转到主屏幕并调用其他API。

有人可以帮我把cookie从那里拿出来吗?

,我发现这个answer,但它是在Objective-C,我不知道如何与斯威夫特

谢谢!

回答

38

雨燕再现可能看起来像:

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() 
+1

感谢@Rob它运行完美! –

+2

当您执行某种“注销”时,不要忘记删除cookie。请在 –

+0

以下检查@Mellian响应请记住,某些cookie不会显示在httpResponse.allHeaderFields下。您将不得不使用iOS提供的共享cookie存储。 –

9

我有同样的问题:这获取,设置或删除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!) 
} 
7

看到上面的答案,但对于斯威夫特3你”我想要这样的事情:

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

试试这个代码:

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

斯威夫特3/4,简洁的解决方案:

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