使用NSURLSession设置cookie

时间:2014-04-22 11:31:50

标签: ios session-cookies nsurlsession

您好我正在开发一个Iphone应用程序我想在服务器响应之后设置cookie并将其用于另一个请求。我的网络请求看起来像。

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) {
        [self.delegate signinWithError:error];
    }
    else {
        [self.delegate signinWithJson:data];
    }
}] resume];

但我不知道如何设置cookie。我知道我必须使用NSHTTPCookieStorage,但我不知道如何设置。而且我也希望将cookie用于其他请求。有没有人知道这件事?需要帮忙。谢谢。

看我试过这种方式

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{      
    if(error) {
        [self.delegate signinWithError:error];
    }
    else {
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
        NSHTTPCookie *cookie;

        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];

        NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields];

        for(NSString *key in [headers allKeys]) {
            NSLog(@"%@ ..PPPP ... %@",key ,[headers objectForKey:key]);
            [cookieProperties setObject:[headers objectForKey:key] forKey:key];
        }

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

        [self.delegate signinWithJson:data];
    }
}] resume];

我只对一个标题字段Set-Cookie SSID=kgu62c0fops35n6qbf12anqlo7; path=/

感兴趣

2 个答案:

答案 0 :(得分:12)

您可以使用sharedHTTPCookieStorage NSHTTPCookieStorage,然后使用setCookies:forURL:mainDocumentURL:或单setCookie: - 后者可能更适合您的需求。

如果这不起作用,您可能需要设置NSURLSessionConfiguration并设置NSHTTPCookieStorage

文档没有说明,但defaultSessionConfiguration可能会使用共享存储。

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

    NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[response URL]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];

    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) {
        [self.delegate signinWithError:error];
    }
    else {
        [self.delegate signinWithJson:data];
    }
}] resume];

答案 1 :(得分:-6)

我研究了很多,但在另一种语言的网站上找到了一个。解决方案是为会话开始和结束添加一个空事件处理程序:

protected void Session_Start(object sender, EventArgs e)
{
}
protected void Session_End(object sender, EventArgs e)
{
}