5

我目前正在研究一个 iOS 编程课程的项目。作为课堂项目的一部分,我正在努力使特定部分成功工作。

我正在使用 NSAlert 对话框来提供我的登录名和密码,以在 HTML 字符串中获取我注册的课程。

我的学院在学院信息系统上维护学生注册的课程表,我可以从中登录并查看我的课程。

我想登录大学网页,该网页有一个名为 submit.asp 的页面来处理从登录表单发送的 POST 请求。在实际的浏览器上,当我提交我的凭据时,经过一些服务器处理并重定向到另一个页面,我可以毫无问题地导航到我的课程安排页面。

- (BOOL) loginToStudentPortal: (NSString *) ID : (NSString *) pin
{
    NSString *submitUrl = @"https://eweb4.laccd.edu/Common/submit.asp";
    NSString *scheduleUrl = @"https://eweb4.laccd.edu/WebStudent/validate.asp";

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    NSURL *URL = [NSURL URLWithString:submitUrl];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL];

    NSString * submitParams = [NSString stringWithFormat:@"ssn1=%@&ssn2=&pin=%@REDIRECT/WebStudent/validate.asp", ID, pin];
    NSString * submitParams2 = [NSString stringWithFormat:@"HOLDER=Y"];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[submitParams dataUsingEncoding:NSUTF8StringEncoding]];

    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
           NSLog(@"%@", error);
        } else {
           //Here I Try to initiate a second dataTaskWithRequest to the next URL
           //But there is no way to jump to the destination page without losing the session

           //NSString *receivedData = [[NSString alloc] initWithData:responseObject encoding:NSASCIIStringEncoding];
           //NSLog(@"%@ %@", response, receivedData);

    }];
    [dataTask resume];
    return YES;
}

但是,当我在 XCode 5 中从 iPhone 模拟器运行初始请求时,我无法在第一个请求后保留会话。

尝试在主完成处理程序的 else 块中启动对 dataTask 请求的后续操作是否正确?

其次,我是否需要手动确保我遵循来自服务器的任何重定向?

4

1 回答 1

0

我能够解决问题并最终到达目标页面。

我最初的尝试是一个开始,但我继续进一步调查该行为,似乎我无法继续进行的一个原因是我正在调试并且我认为超时正在发生。

当我运行程序并删除所有断点时,程序将输出正确的 HTML。

更重要的是,我确保在我的函数中重现了确切的事件链。我添加了完成处理程序中所需的所有 dataTasks。

我最终能够检索到包含所需信息的 HTML 字符串。

事实证明,会话是由我使用的方法管理的。可能我有一个会话超时,这就是我提出最初问题的原因。

于 2013-11-19T06:30:02.263 回答