使用 NSURLSession 设置 cookie
Posted
技术标签:
【中文标题】使用 NSURLSession 设置 cookie【英文标题】:Set cookies with NSURLSession 【发布时间】:2014-06-06 17:57:22 【问题描述】:您好,我正在开发一个 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=/
感兴趣
【问题讨论】:
【参考方案1】:您可能只需将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];
【讨论】:
我在登录请求后有标题字段。所以我有两种方法可以做到这一点,一种将我的会话 ID(或要求字段)添加到用户数据中或将其保存为 cookie。我决定使用cookies。但我不知道如何创建以及如何使用 NSURLSESSION 传递 cookie。 您能否发布标题字段 - 请随意删除重要数据 您在响应中有 cookie - 我以为您想在请求中设置它 :)。看到这是完整的场景。用户将登录到我的应用程序。登录后,我必须为该用户维护会话。因此,一旦用户登录,我正在做的事情就是将会话 ID 保存一段时间。因此,如果用户在我的应用程序中执行某些活动,我需要该会话 ID。否则服务器会给出 401 错误。因此,在登录任何请求后,我将传递该会话 ID 以在服务器端进行身份验证。这是正确的方法还是有更好的方法。很高兴接受更好的:) 任何使用sharedSession
的请求都将使用共享 cookie 存储,因此它们将获取具有匹配域和路径的所有 cookie。【参考方案2】:
我进行了很多研究,但在另一种语言的网站上找到了一个。解决方案是为会话开始和结束添加一个空的事件处理程序:
protected void Session_Start(object sender, EventArgs e)
protected void Session_End(object sender, EventArgs e)
【讨论】:
我不知道你是在这里答错了问题还是什么,但这个答案与问题完全无关。以上是关于使用 NSURLSession 设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章
我可以在创建 NSURLSession 后更新其配置中的 cookie 吗?
iOS 10 beta NSURLSession 请求的 cookie 消失了