通过POST登录后如何到达下一页

时间:2014-02-10 17:08:42

标签: ios objective-c nsurlrequest

在下一个代码行中,我尝试通过POST登录moodle系统。这很有效,如果我留下两行注释,我可以在登录后看到网页。但是当我尝试导航到下一个位于受保护区域的网页时,我总能看到登录页面。

所以我的问题是,如何导航到受保护的页面并在webview中显示它?

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults synchronize];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[defaults stringForKey:@"loginpage"]]];

    [request setHTTPMethod:@"POST"];

    NSString *post =[[NSString alloc] initWithFormat:@"username=%@&password=%@",
                 [defaults stringForKey:@"username"],[defaults stringForKey:@"password"]];
    NSLog(@"Post is: %@",post);

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSLog(@"postData is: %@",postData);

    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    NSLog(@"postLength is: %@",postLength);

    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];

    [request setHTTPBody:postData];

    NSLog(@"request is: %@", [request allHTTPHeaderFields]);


    [self.webview loadRequest:request];

    //if i do not comment the next two lines, the loginpage is displayed in the webview.
    //Otherwise the correct page with username after login is displayed.
    //request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[defaults stringForKey:@"displaypage"]]];

    //[self.webview loadRequest:request];

    NSLog(@"Done");

2 个答案:

答案 0 :(得分:1)

loadRequest方法是异步的,这意味着当方法返回时,很可能它还没有完成加载第一个网页。 因此,当您取消注释这两行时,可能第二个请求正在执行而第一个请求尚未完成。

您应该在UIWebViewDelegate的webViewDidFinishLoad:方法中执行第二个请求。

答案 1 :(得分:0)

在故事板中设置委托后,以下代码完成了这项工作:

    -(void)webViewDidFinishLoad:(UIWebView *)webView {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults synchronize];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[defaults stringForKey:@"displaypage"]]];
    [self.webview loadRequest:request];
}