2009-04-01 10 views
9

Piszę program w Objective-C i muszę tworzyć żądania sieciowe na serwerze WWW, ale asynchronicznie i jestem całkiem nowy na macu, jestem bardzo dobry w technologiach Windows, ale Muszę wiedzieć, że jeśli użyję NSOperation (wprowadzonego w 10.5, zakładam, że nie uruchomi się on w 10.4 MAC?), Czy też został zaimplementowany w taki sposób, że wykorzystuje systemowy wątek, który będzie dostępny na 10.4?Objective-C Asynchronous Web Request z plikami cookie

Albo powinienem stworzyć nowy wątek i utworzyć nowy runloop, także jak używać ciasteczek itp., Jeśli ktoś może dać mi jeden mały przykład, który będzie bardzo pomocny. Chcę, aby ta próbka również działała na Mac 10.4, jeśli to możliwe.

Odpowiedz

29

Jest to dobry przykład wykorzystania NSURLRequest i NSHTTPCookies zrobić pełną przykładem aplikacji internetowej, logując się na stronie internetowej, przechowywania cookie sessionid i ponownym go w przyszłych żądań.

NSURLConnection, NSHTTPCookie

Przez 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]); 
+0

bardzo dziękuję! – Hamy

+0

Jak to jest asynchroniczne ??? –

+1

Dziękuję za odpowiedź, ale mam pytanie, podałeś różne adresy URL, na przykład dla pierwszego podanego adresu [this] (http: // temp/gomh/authenticate.py? SetCookie = 1) URL, a dla drugiego jeden http: // temp i tak dalej. Skąd mam znać URL plików cookie, ponieważ usługa internetowa, której używam w mojej aplikacji, nie podała tych informacji? – Hamid

18

Dla żądań asynchronicznych należy użyć NSURLConnection.

Dla plików cookie, zobacz NSHTTPCookie i NSHTTPCookieStorage.

UPDATE:

Poniższy kod jest prawdziwe, pracujący kod z jednego z moich aplikacji. responseData jest zdefiniowany jako NSMutableData* w interfejsie klasy.

- (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]; 
} 
+1

@Akash: czy próbowałeś metody connectionWithRequest: delegate: NSURLConnection? Przykro mi, ale nie widzę żadnej wzmianki o NSURLConnection lub NSHTTPCookie w twoim pytaniu. Zaufaj mi, wszystko, czego potrzebujesz, znajduje się w linkach, które podałem. –

+0

Już go użyłem, to nie działa, więc pomyślałem, że musi istnieć jakiś inny sposób wykonania żądania asynchronicznego, ponieważ nie ma żadnego przykładowego kodu, który mógłby to zrobić. Oto kod, który wypróbowałem .. http://stackoverflow.com/questions/706355/whats-wrong-on-following-urlconnection –

+0

@Akash: NSURLConnection to najprostszy sposób. Opublikuję przykładowy kod. –

3

jestem w stanie pobrać plik cookie w taki sposób:

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

Ten działa dobrze dla asynchronicznego żądania, jak również.