ios 使用 NSURLSession 设置 cookie
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23218242/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Set cookies with NSURLSession
提问by nilkash
Hi I am developing one Iphone application In which I want to set cookies after server response and use that for another request. My network request looks like.
嗨,我正在开发一个 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];
But I don't know how to set cookies. I know I have to use NSHTTPCookieStorage
but I don't know how to set. And I also want to use that cookies for another request. Is there any one who knows about this? Need help. Thank you.
但我不知道如何设置cookies。我知道我必须使用,NSHTTPCookieStorage
但我不知道如何设置。而且我还想将该 cookie 用于另一个请求。有没有人知道这一点?需要帮忙。谢谢你。
See I tried in this way
看我这样试过
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];
I am interested in only one header field Set-Cookie SSID=kgu62c0fops35n6qbf12anqlo7; path=/
我只对一个标题字段感兴趣 Set-Cookie SSID=kgu62c0fops35n6qbf12anqlo7; path=/
采纳答案by Rich
You can probably get away with just using the sharedHTTPCookieStorage
for NSHTTPCookieStorage
, and then use setCookies:forURL:mainDocumentURL:
or the single setCookie:
- the latter might be better for your needs.
您可能只需使用sharedHTTPCookieStorage
for NSHTTPCookieStorage
,然后使用setCookies:forURL:mainDocumentURL:
或 single就可以逃脱setCookie:
- 后者可能更适合您的需求。
If this doesn't work you might need to setup the NSURLSessionConfiguration
and set the NSHTTPCookieStorage
如果这不起作用,您可能需要设置NSURLSessionConfiguration
并设置NSHTTPCookieStorage
The docs don't state it, but the defaultSessionConfiguration
might use the shared store anyway.
文档没有说明,但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];
回答by Carson
I researched a lot but found one in a website of another language. The solution is to add an empty event handler for session start and end:
我研究了很多,但在另一种语言的网站上找到了一个。解决方案是为会话开始和结束添加一个空的事件处理程序:
protected void Session_Start(object sender, EventArgs e)
{
}
protected void Session_End(object sender, EventArgs e)
{
}