Iphone ASIHttprequest登录
我得到以下情况。我正在用tabbarcontroller和导航控制器开发iPhone应用程序。使用该应用程序登录到web服务器(提供web服务)以获取会话cookie后,我单击选项卡导航菜单,该菜单向其中一个web服务发出请求。调用此web服务时,我得到一个句柄状态代码,告诉我im未登录到服务器,即使应用程序第一次成功登录到web服务器。所以我不确定我做错了什么,我在这里留下了我的代码片段 AppDelegateIphone ASIHttprequest登录,iphone,objective-c,uitabbarcontroller,asihttprequest,Iphone,Objective C,Uitabbarcontroller,Asihttprequest,我得到以下情况。我正在用tabbarcontroller和导航控制器开发iPhone应用程序。使用该应用程序登录到web服务器(提供web服务)以获取会话cookie后,我单击选项卡导航菜单,该菜单向其中一个web服务发出请求。调用此web服务时,我得到一个句柄状态代码,告诉我im未登录到服务器,即使应用程序第一次成功登录到web服务器。所以我不确定我做错了什么,我在这里留下了我的代码片段 AppDelegate - (BOOL)application:(UIApplication *)appl
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[super application:application didFinishLaunchingWithOptions:launchOptions];
[self initTabBarMenu];
return YES;
}
// call when the app is not login
- (void) showLogin
{
loginViewController = [[LoginViewController alloc] init];
[self.tabBarController presentModalViewController:loginViewController animated:YES];
}
逻辑视图控制器
- (void) viewDidLoad
{
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *username = [defaults objectForKey:@"usernameApp"];
NSString *password = [defaults objectForKey:@"passwordAp"];
if (![StrUtil isEmpty:username] && ![StrUtil isEmpty:password])
{
userField.text = username;
passwordField.text = password;
[self loginCheck];
}
}
- (void) loginCheck
{
NSString *url = @"http://localhost/service/login";
ASIFormDataRequest *theRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
[theRequest setUseKeychainPersistence:YES];
[theRequest setDelegate:self];
[theRequest addPostValue:userField.text forKey:@"username"];
[theRequest addPostValue:passwordField.text forKey:@"password"];
[theRequest setDidFinishSelector:@selector(loginDone:)];
[theRequest setDidFailSelector:@selector(loginFailed:)];
[theRequest startAsynchronous];
[userField resignFirstResponder];
[passwordField resignFirstResponder];
}
- (void) loginResponse:(ASIFormDataRequest *)theRequest
{
nsData = [[NSDictionary alloc] initWithDictionary:[theRequest.responseString JSONValue]];
[self hideProgress];
if ([[nsData objectForKey:@"status"] integerValue] == 1)
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:userField.text forKey:@"usernameApp"];
[defaults setObject:passwordField.text forKey:@"passwordApp"];
[defaults synchronize];
// Remove current view controller
[self.parentViewController dismissModalViewControllerAnimated:YES];
}
else
{
[self showAlert:@"Problem"];
}
}
- (id) init
{
if ((self = [super init]))
{
self.title = @"My Home";
self.url = @"http://localhost/services/gethome"
}
return self;
}
问题是:当我获得菜单时,我没有从我的Web服务中获得任何数据,实际上应用程序甚至没有尝试调用它,我使用BaseController从那里调用每个Web服务,因此我得到了从BaseController扩展而来的HomeViewController,因此,我得到了一个在BaseController上调用webservice的通用方法,如下所示:
- (void) callRequest
{
//url is a NSString and you can set on HomeviewController
if ([StrUtils isEmpty:url]) return;
request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]];
//[request setDownloadCache:[ASIDownloadCache sharedCache]];
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
[request setSecondsToCache:60*60*24*7]; // Cache for 7 days
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
[request setDelegate:self];
[request setResponseEncoding:NSUTF8StringEncoding];
[request setDefaultResponseEncoding:NSUTF8StringEncoding];
[request setDidFinishSelector:@selector(requestFinished:)];
[request setDidFailSelector:@selector(finishedWithError:)];
[request setTimeOutSeconds:15];
[request startAsynchronous];
}
- (void) requestFinished:(ASIHTTPRequest*)theRequest
{
NSString *responseString = [theRequest responseString];
nsData = [[NSDictionary alloc] initWithDictionary:[responseString JSONValue]];
if ([[receivedData objectForKey:@"status"] integerValue] == 1)
{
return [(AppDelegate *)[[UIApplication sharedApplication] delegate] showLogin];
}
}
然后我从viewDidLoad调用webservice
- (void) viewDidLoad
{
[super viewDidLoad];
[self callRequest];
}
HomeViewController
- (void) viewDidLoad
{
[super viewDidLoad];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *username = [defaults objectForKey:@"usernameApp"];
NSString *password = [defaults objectForKey:@"passwordAp"];
if (![StrUtil isEmpty:username] && ![StrUtil isEmpty:password])
{
userField.text = username;
passwordField.text = password;
[self loginCheck];
}
}
- (void) loginCheck
{
NSString *url = @"http://localhost/service/login";
ASIFormDataRequest *theRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
[theRequest setUseKeychainPersistence:YES];
[theRequest setDelegate:self];
[theRequest addPostValue:userField.text forKey:@"username"];
[theRequest addPostValue:passwordField.text forKey:@"password"];
[theRequest setDidFinishSelector:@selector(loginDone:)];
[theRequest setDidFailSelector:@selector(loginFailed:)];
[theRequest startAsynchronous];
[userField resignFirstResponder];
[passwordField resignFirstResponder];
}
- (void) loginResponse:(ASIFormDataRequest *)theRequest
{
nsData = [[NSDictionary alloc] initWithDictionary:[theRequest.responseString JSONValue]];
[self hideProgress];
if ([[nsData objectForKey:@"status"] integerValue] == 1)
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:userField.text forKey:@"usernameApp"];
[defaults setObject:passwordField.text forKey:@"passwordApp"];
[defaults synchronize];
// Remove current view controller
[self.parentViewController dismissModalViewControllerAnimated:YES];
}
else
{
[self showAlert:@"Problem"];
}
}
- (id) init
{
if ((self = [super init]))
{
self.title = @"My Home";
self.url = @"http://localhost/services/gethome"
}
return self;
}
总之,问题是:我无法从我的tabbarnavigation中获得任何部分的任何数据。第一次单击1项时,它会加载loginviewcontroller(即使以前登录成功),然后再次调用Web服务以登录。在第二次登录后,我无法直接获取任何数据
我不知道我能做什么,谢谢你的建议和回答 您的问题可能是登录请求中不接受cookies。测试以查看登录调用后Cookie的值