objective-c - NSURLConnection GET 和 POST 不工作

标签 objective-c ios cocoa-touch nsurlconnection

我没有从服务器获得正确的输出。我每次得到的回复是:

Gone

/prod/bwckgens.p_proc_term_datehas been permanently removed from this server.

当您将 Web 浏览器定向到页面 here 时,通常会收到此消息而不是通过 this第一页。这让我得出一个 cookie 没有被保存的结论,但我在文档中读到这都是由 NSURLConnection 对象处理的。我在这里做错了什么吗?

#import "PCFViewController.h"

@interface PCFViewController ()

@end

NSMutableData *mutData;

@implementation PCFViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)queryServer {
    NSURL *url = [NSURL URLWithString:@"https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_disp_dyn_sched"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:3.0];
    //the reason I perform a GET here is just to get a cookie and communicate like a normal web browser, since directly doing a POST to the proper address isn't working
    [request setHTTPMethod:@"GET"];
    [request setValue:@"text/html; charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    if (connection) {
        mutData = [NSMutableData data];
    }
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"Succeeded! Received %d bytes of data",[mutData length]);
    NSString *str = [[NSString alloc] initWithData:mutData encoding:NSUTF8StringEncoding];
    //just to see the contents(for debugging)
    NSLog(@"%@", str);

    [self handleConnection:connection];
}

-(void)handleConnection:(NSURLConnection *)connection
{
    //this is the first step
    if ([@"/prod/bwckschd.p_disp_dyn_sched" isEqualToString:[[[connection originalRequest] URL] path]]) {
        //first request
        //POST
        NSURL *url = [NSURL URLWithString:@"https://selfservice.mypurdue.purdue.edu/prod/bwckgens.p_proc_term_date"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed timeoutInterval:3.0];
        [request setHTTPMethod:@"POST"];
        NSString *args = @"p_calling_proc=bwckschd.p_disp_dyn_sched&p_term=201320";
        NSData *requestBody = [args dataUsingEncoding:NSUTF8StringEncoding];
        [request setHTTPBody:requestBody];
        connection = [connection initWithRequest:request delegate:self];
        [connection start];
        if (connection) {
            mutData = [NSMutableData data];
        }
        //second step. Here I send the list of classes(COMPUTER SCIENCE) I want to display as well as the term SPRING2013
    }else if([@"/prod/bwckgens.p_proc_term_date" isEqualToString:[[[connection currentRequest] URL] path]]) {
        NSURL *url = [NSURL URLWithString:@"https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_get_crse_unsec"];
        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLCacheStorageAllowed
                                                           timeoutInterval:3.0];
        [request setHTTPMethod:@"POST"];
        NSString *args = @"term_in=201320&sel_subj=dummy&sel_day=dummy&sel_schd=dummy&sel_insm=dummy&sel_camp=dummy&sel_levl=dummy&sel_sess=dummy&sel_instr=dummy&sel_ptrm=dummy&sel_attr=dummy&sel_subj=CS&sel_crse=dummy&sel_title=dummy&sel_schd=%25&sel_from_cred=&sel_to_cred=&sel_camp=%25&sel_ptrm=%25&sel_instr=%25&sel_sess=%25&sel_attr=%25&begin_hh=0&begin_mi=0&begin_ap=a&end_hh=0&end_mi=0&end_ap=a";
        NSData *requestBody = [args dataUsingEncoding:NSUTF8StringEncoding];
        [request setHTTPBody:requestBody];
        connection = [connection initWithRequest:request delegate:self];
        [connection start];
        if (connection) {
            mutData = [NSMutableData data];
        }
        //the courses should be shown now I have to parse the data
    }else if([@"/prod/bwckschd.p_get_crse_unsec" isEqualToString:[[[connection currentRequest] URL] path]]) {


    }
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"%@\n", error.description);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [mutData setLength:0];
    NSLog(@"%@\n", response.description);

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [mutData appendData:data];
}
@end

最佳答案

一旦启动,您就无法更改具有相同 URL 连接的请求对象。阅读 NSURLConnection 的文档。它说:

The URL request to load. The request object is deep-copied as part of the initialization process. Changes made to request after this method returns do not affect the request that is used for the loading process.

所以如果你想点击另一个 URL,你必须创建一个新的 URLRequest 和新的 URLConnection 对象。关于您关于保存 cookie 的问题。您可以使用以下方法设置 URLRequest 的缓存策略

- (void)setCachePolicy:(NSURLRequestCachePolicy)policy

关于objective-c - NSURLConnection GET 和 POST 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078616/

相关文章:

ios - 无法在 UITableViewCell 中禁用 UIButton

iphone - 应用程序处于后台状态时的 CLLocationManager

objective-c - xcode处理无连接时的xml解析堆栈

objective-c - 使用Xcode产品>配置文件构建时找不到RestKit.h

objective-c - "unrecognized selector"不存在

iphone - iOS - 尝试旋转文本标签并且标签消失

iphone - 在模拟器上可以,但在iPhone上不行,如何调试?

ios - UIScrollView 内部一致性崩溃

iOS:如何同步两个 UIScrollview

ios - 提取 NSString 中两个子串之间的部分