问题 iPhone发出POST请求,处理cookie


我希望有人可以对以下内容有所了解,我认为我正朝着正确的方向前进。我想用user / pass组合登录我的服务器,然后我需要能够告诉我如果我正确登录(应删除cookie),那么如果是这种情况我会再提出请求。

任何帮助表示赞赏,下面是我正在使用的代码:

[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

NSString *post =[NSString stringWithFormat:@"name=%@&pass=%@",@"foo", @"bar"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:@"http://www.mywebserver.com/login.php"]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *data=[[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
NSLog(data);

// HOW to Check if there was a Cookie dropped??


// Make another request..

12971
2017-11-02 12:09


起源



答案:


这应该工作:

NSDictionary *headerFields = [(NSHTTPURLResponse*)response allHeaderFields]; 
NSURL *url = [NSURL URLWithString:@"http://www.mywebserver.com/login.php"];   
NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:headerFields forURL:url];

然后你就可以知道了 cookies 数组包含您想要的cookie。

您也可以在收到回复后调用此方法:

NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:url];

10
2017-11-02 12:58





以下是使用当前代码的可能解决方案:

1 - 你一开始做的很好:一般设置cookie政策。

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHttpCookieStorage];
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

2 - 之后,在您的请求中,您需要指定您要使用cookie(以便注入会话信息):

[request setHTTPShouldHandleCookies:YES];

您需要为身份验证和后续请求设置此字段。


3
2017-09-14 18:24



只需快速更正,它应该是: NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHttpCookieStorage];  谢谢(你的)信息! - Anson MacKeracher
谢谢你指出Anson,只是纠正了。 - Sauleil


答案:


这应该工作:

NSDictionary *headerFields = [(NSHTTPURLResponse*)response allHeaderFields]; 
NSURL *url = [NSURL URLWithString:@"http://www.mywebserver.com/login.php"];   
NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:headerFields forURL:url];

然后你就可以知道了 cookies 数组包含您想要的cookie。

您也可以在收到回复后调用此方法:

NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:url];

10
2017-11-02 12:58





以下是使用当前代码的可能解决方案:

1 - 你一开始做的很好:一般设置cookie政策。

NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHttpCookieStorage];
[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

2 - 之后,在您的请求中,您需要指定您要使用cookie(以便注入会话信息):

[request setHTTPShouldHandleCookies:YES];

您需要为身份验证和后续请求设置此字段。


3
2017-09-14 18:24



只需快速更正,它应该是: NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHttpCookieStorage];  谢谢(你的)信息! - Anson MacKeracher
谢谢你指出Anson,只是纠正了。 - Sauleil