2015-03-28 3 views
2

У меня есть NSURLSession, который звонит dataTaskWithRequest, чтобы отправить запрос POST. Я изменил пример, который я нашел here.Как получить файл cookie из NSURLResponse в Swift?

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

    // Other stuff goes here 

}) 

Возможно, я не могу получить заголовок от ответа. Я знаю, что файл cookie, который я хочу, находится где-то в заголовке, потому что когда я распечатываю ответ в приведенном выше коде, он показывает мне cookie, который я хочу. Но как я могу получить cookie оттуда?

Я попытался разбора JSON, но я не мог понять, как получить NSURLResponse в NSData что-то вроде этого:

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

Я дноуглубительных через стек перетекания ищет легкий путь получить куки из ответа, и я ничего не нашел. Любая помощь будет оценена по достоинству.

ответ

4
// 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() 
+0

Привет :)! Было бы неплохо, если бы вы могли добавить короткое объяснение коду, чтобы другие могли понять его с большей легкостью. –

+2

@JakobRunge Привет, я добавил комментарии к коду для более легкого понимания! Надеюсь, поможет! :) –

1

Попробуйте передать свой NSURLResponse на запрос NSHTTPURLResponse, а затем используйте свойство «allHeaderFields». Это свойство - словарь, в котором вы должны найти свое Cookie.

+0

Это, кажется, не хотят, чтобы позволить мне сделать это. Когда я пытаюсь «let someResponse: NSHTTPURLResponse = response», он дает мне сообщение об ошибке: «NSURLResponse не конвертируется для ввода NSHTTPURLResponse». – FlaqueDeau

+0

let someResponse = response as NSHTTPURLResponse – Satachito

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

Swift 3 обновление: Дает вам [HttpCookie]

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