如何从Swift中的NSURLResponse中检索cookie?

时间:2015-03-28 20:34:27

标签: ios json swift cookies

我有一个NSURLSession,它调用dataTaskWithRequest来发送POST请求。我修改了我找到的here示例。

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
    println("Response: \(response)")

    // Other stuff goes here

})

我似乎无法从响应中获得标题。我知道我想要的cookie是在标题中的某个位置,因为当我在上面的代码中打印出响应时,它会向我显示我想要的cookie。但是如何才能正确地将饼干拿出来?

我尝试解析JSON,但我无法弄清楚如何将NSURLResponse转换为NSData,如下所示:

NSJSONSerialization.JSONObjectWithData(ResponseData, options: .MutableLeaves, error: &err)

我已经通过堆栈循环挖掘,寻找一种从响应中获取Cookie的简单方法,而我却找不到任何东西。任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分:6)

// Setup a NSMutableURLRequest to your desired URL to call along with a "POST" HTTP Method

var aRequest = NSMutableURLRequest(URL: NSURL(string: "YOUR URL GOES HERE")!)
var aSession = NSURLSession.sharedSession()
aRequest.HTTPMethod = "POST"

// Pass your username and password as parameters in your HTTP Request's Body

var params = ["username" : "ENTER YOUR USERNAME" , "password" : "ENTER YOUR PASSWORD"] as Dictionary <String, String>
var err: NSError?
aRequest.HTTPBody = NSJSONSerialization.dataWithJSONObject(params, options: nil, error: &err)

// The following header fields are added so as to get a JSON response

aRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
aRequest.addValue("application/json", forHTTPHeaderField: "Accept")

// Setup a session task which sends the above request

var task = aSession.dataTaskWithRequest(aRequest, completionHandler: {data, response, error -> Void in

     // Save the incoming HTTP Response

     var httpResponse: NSHTTPURLResponse = response as! NSHTTPURLResponse

     // Since the incoming cookies will be stored in one of the header fields in the HTTP Response, parse through the header fields to find the cookie field and save the data

     let cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(httpResponse.allHeaderFields, forURL: response.URL!) as! [NSHTTPCookie]

     NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies as [AnyObject], forURL: response.URL!, mainDocumentURL: nil)

})

task.resume()

答案 1 :(得分:3)

Swift 3更新:给你一个[HTTPCookie]

    if let url = urlResponse.url,
       let allHeaderFields = urlResponse.allHeaderFields as? [String : String] {
       let cookies = HTTPCookie.cookies(withResponseHeaderFields: allHeaderFields, for: url)
    }

答案 2 :(得分:1)

尝试将NSURLResponse转换为NSHTTPURLResponse,然后使用名为&#39; allHeaderFields&#39;的属性。该属性是一个字典,您应该在其中找到您的Cookie。

答案 3 :(得分:1)

            let cookies: [NSHTTPCookie]?
            if let responseHeaders = response.allHeaderFields as? [String:String] {
                cookies = NSHTTPCookie.cookiesWithResponseHeaderFields(responseHeaders, forURL:request.URL!)
                NSHTTPCookieStorage.sharedHTTPCookieStorage().setCookies(cookies!, forURL: response.URL!, mainDocumentURL: nil)
            }