Jac*_*tra 4 cocoa-touch objective-c
所以我遇到了以下问题:
我有一个登录viewcontroller和一个窗体viewcontroller.在登录视图控制器上,我向PHP脚本发送POST请求,该脚本验证用户是否具有访问权限.该脚本只返回1或0.所以我可以选择解除或维护viewcontroller.正确传递凭据后,用户将看到表单控制器.该控制器有一个按钮来获取表单.
获取表单的按钮向另一个PHP脚本发出POST请求,该脚本将返回带有用户值的XML文档.我需要一种方法来记住用户通过的用户名和密码.所以我可以在另一个(视图)控制器中使用它们.
有人知道实现这个目标的方法吗?
如果你正在使用NSURLConnection,并且会话是基于cookie的,那么这将自动完成.所以你需要写的就是这个
NSMutableURLRequest *request = nil;
request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://server.com/login.php"]];
NSString *post = [NSString stringWithFormat:@"username=%@&password=%@", @"<username>", @"<password>"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
[request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
[request setTimeoutInterval: 15];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
_urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[_urlConnection start];
Run Code Online (Sandbox Code Playgroud)
而且您还必须实现NSURLConnectionDelegate方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[_responseData appendData:data];
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
//Oops! handle failure here
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
if (_statusCode >= 200 && _statusCode < 400) {
//Things look ok
NSString *responseString = [[[NSString alloc] initWithData:_responseData] autorelease];
//Send this to an xml lib and parse
}
[_responseData release];
_responseData = nil;
[connection autorelease];
}
Run Code Online (Sandbox Code Playgroud)
如果您在标题中有一些其他信息,并且需要通过后续请求发送回来,您可以从响应中读取它,如下所示
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSDictionary *headerFields = [(NSHTTPURLResponse*)response allHeaderFields]; //This would give you all the header fields;
}
}
Run Code Online (Sandbox Code Playgroud)
并为此下一个请求设置标题字段
[request setValue:[NSString stringWithFormat:@"%d", [postData length]] forHTTPHeaderField:@"Content-Length"];
Run Code Online (Sandbox Code Playgroud)
要保存信息,可以使用NSUserDefaults作为用户名和/或密码或会话信息
//To save
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults) {
[standardUserDefaults setObject:@"<username>" forKey:@"username"];
[standardUserDefaults setObject:@"<pass>" forKey:@"password"];
[standardUserDefaults synchronize];
}
//To retrieve
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSString *val = nil;
if (standardUserDefaults)
val = [standardUserDefaults objectForKey:@"username"];
Run Code Online (Sandbox Code Playgroud)
最后,建议使用[例如:具有用户名和密码属性的用户类]来构建模型以映射xml API.
谷歌为Apple的MVC文档.
希望这可以帮助!