Вход в ASIHttprequest - PullRequest
       2

Вход в ASIHttprequest

0 голосов
/ 27 ноября 2011

Я получил следующую ситуацию. Я делаю приложение для iPhone с tabbarcontroller и контроллером навигации. После использования приложения для входа на веб-сервер (который предоставляет веб-сервисы) для получения файла cookie сеанса я нажимаю на меню tabbarnavigation, которое отправляет запрос на один из веб-сервисов. Вызывая этот веб-сервис, я получил код состояния дескриптора, который сообщает мне, что я не вошел на сервер, хотя приложение впервые успешно зашло на веб-сервер. Так что я не уверен, что делаю неправильно, я оставляю здесь фрагмент своего кода.

AppDelegate

- (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];
}

LoginViewController

- (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"];
    }
}

Вот проблема: когда я получаю меню, я не получаю никаких данных от своих веб-сервисов, фактически приложение даже не пытается вызвать его, я использую BaseController для вызова каждого отдельного веб-сервиса оттуда, поэтому я получил свой HomeViewController, который расширяется от BaseController, поэтому я получил универсальный метод для вызова webservice на моем BaseController, например:

- (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

- (void) viewDidLoad
{
    [super viewDidLoad];
    [self callRequest];

}

HomeViewController

- (id) init
{
    if ((self = [super init]))
    {
        self.title = @"My Home";
        self.url = @"http://localhost/services/gethome"
    }

    return self;
}

Итак, в общем, проблема в том, что я не могу получить данные для какого-либо раздела из моей вкладки. В первый раз, когда я нажимаю на 1 элемент, он загружает loginviewcontroller (даже если вход был ранее успешным), а затем снова вызывает веб-сервис для входа в систему. И сразу после второго входа я не могу получить никаких данных.

Ну, я не уверен, что я могу сделать, спасибо за все ваши предложения и ответы.

1 Ответ

0 голосов
/ 28 ноября 2011

Возможно, ваша проблема в том, что вы не принимаете файлы cookie в запросе на вход. Протестируйте, чтобы узнать, какова ценность ваших файлов cookie после вызова входа в систему.

...