0

サーバーから正しい出力が得られません。私が毎回返す応答は次のとおりです。

なくなった

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

これは通常、最初にこのページを通過するのではなく、Web ブラウザをここのページに誘導した場合に受信されます。これにより、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
4

1 に答える 1

2

一度開始すると、同じ URL 接続を持つ要求オブジェクトを変更することはできません。NSURLConnection のドキュメントを読んでください。それは言います:

ロードする URL リクエスト。リクエスト オブジェクトは、初期化プロセスの一部としてディープ コピーされます。このメソッドが返された後にリクエストに加えられた変更は、読み込みプロセスに使用されるリクエストには影響しません。

したがって、別の URL にアクセスしたい場合は、新しい URLRequest オブジェクトと新しい URLConnection オブジェクトを作成する必要があります。Cookie の保存に関するご質問について。次のメソッドを使用して、URLRequest のキャッシュ ポリシーを設定できます。

- (void)setCachePolicy:(NSURLRequestCachePolicy)policy
于 2012-10-25T23:19:17.970 に答える