Objective-C Асинхронный веб-запрос с файлами cookie - PullRequest
9 голосов
/ 01 апреля 2009

Я пишу программу на Objective-C и мне нужно делать веб-запросы к веб-серверу, но асинхронно, и я довольно новичок в Mac, я очень хорош в технологиях Windows, но мне нужно знать, что если я использую NSOperation (введенный в 10.5, я предполагаю, что он не будет работать в 10.4 MAC?), Или если он был реализован так, что он использует системную многопоточность, которая будет доступна на 10.4?

Или я должен создать новый поток и создать новый цикл запуска, а также как использовать файлы cookie и т. Д., Если кто-нибудь может дать мне один небольшой пример, который будет очень полезен. Я хочу, чтобы этот пример тоже работал на Mac 10.4.

Ответы [ 3 ]

29 голосов
/ 17 июля 2009

Есть хороший пример использования NSURLRequest и NSHTTPCookies для создания полного примера веб-приложения для входа на веб-сайт, сохранения файла cookie SessionID и повторной отправки его в будущих запросах.

NSURLConnection, NSHTTPCookie

По logix812:

    NSHTTPURLResponse   * response;
    NSError             * error;
    NSMutableURLRequest * request;
    request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://temp/gomh/authenticate.py?setCookie=1"]
                                            cachePolicy:NSURLRequestReloadIgnoringCacheData 
                                        timeoutInterval:60] autorelease];

    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
    NSLog(@"RESPONSE HEADERS: \n%@", [response allHeaderFields]);

    // If you want to get all of the cookies:
    NSArray * all = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[NSURL URLWithString:@"http://temp"]];
    NSLog(@"How many Cookies: %d", all.count);
    // Store the cookies:
    // NSHTTPCookieStorage is a Singleton.
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:all forURL:[NSURL URLWithString:@"http://temp"] mainDocumentURL:nil];

    // Now we can print all of the cookies we have:
    for (NSHTTPCookie *cookie in all)
        NSLog(@"Name: %@ : Value: %@, Expires: %@", cookie.name, cookie.value, cookie.expiresDate); 


    // Now lets go back the other way.  We want the server to know we have some cookies available:
    // this availableCookies array is going to be the same as the 'all' array above.  We could 
    // have just used the 'all' array, but this shows you how to get the cookies back from the singleton.
    NSArray * availableCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:@"http://temp"]];
    NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:availableCookies];

    // we are just recycling the original request
    [request setAllHTTPHeaderFields:headers];

    request.URL = [NSURL URLWithString:@"http://temp/gomh/authenticate.py"];
    error       = nil;
    response    = nil;

    NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSLog(@"The server saw:\n%@", [[[NSString alloc] initWithData:data encoding: NSASCIIStringEncoding] autorelease]);
18 голосов
/ 01 апреля 2009

Для асинхронных запросов необходимо использовать NSURLConnection.

Для файлов cookie см. NSHTTPCookie и NSHTTPCookieStorage.

UPDATE

Код ниже является реальным, рабочим кодом одного из моих приложений. responseData определяется как NSMutableData* в интерфейсе класса.

- (void)load {
    NSURL *myURL = [NSURL URLWithString:@"http://stackoverflow.com/"];
    NSURLRequest *request = [NSURLRequest requestWithURL:myURL
                                             cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                         timeoutInterval:60];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    responseData = [[NSMutableData alloc] init];
}

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

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    [responseData release];
    [connection release];
    // Show error message
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Use responseData
    [responseData release];
    [connection release];
}
3 голосов
/ 10 августа 2010

Я могу получить cookie таким образом:

NSArray* arr = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString: @"http://google.com" ]];

Этот работает и для асинхронного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...