2009-04-01 23 views
9

Estoy escribiendo un programa en Objective-C y necesito hacer solicitudes web al servidor web, pero de forma asíncrona y soy bastante nuevo en mac, soy muy bueno en las tecnologías de Windows, pero Necesito saber que si uso NSOperation (introducido en 10.5, supongo que no se ejecutará en 10.4 MAC?), O si fue implementado de manera que utiliza el sistema de subprocesamiento que estará disponible en 10.4?Objective-C Solicitud web asincrónica con cookies

O debería crear un nuevo hilo y crear un nuevo runloop, también cómo usar cookies, etc., si alguien puede darme un pequeño ejemplo, eso será de gran ayuda. También quiero que esta muestra se ejecute en mac 10.4 si es posible.

Respuesta

29

Hay un buen ejemplo del uso de NSURLRequest y NSHTTPCookies para hacer un ejemplo de aplicación web completa de la sesión en un sitio web, almacenar la cookie SessionID y volver a presentar en futuras peticiones.

NSURLConnection, NSHTTPCookie

Por 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

muchas gracias aquí! – Hamy

+0

¿Cómo es eso asincrónico? –

+1

Gracias por su respuesta, pero tengo una pregunta, especificó diferentes URL, por ejemplo, para la primera que proporcionó [this] (http: //temp/gomh/authenticate.py? SetCookie = 1) URL y para la segunda uno http: // temp y así sucesivamente. ¿Cómo sé la URL de las cookies, ya que el servicio web que estoy usando en mi aplicación no ha proporcionado esta información? – Hamid

18

Para solicitudes asincrónicas, necesita usar NSURLConnection.

Para las cookies, vea NSHTTPCookie y NSHTTPCookieStorage.

ACTUALIZACIÓN:

El código siguiente es real, el código de trabajo de una de mis aplicaciones. responseData se define como NSMutableData* en la interfaz de clase.

- (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: ¿has probado la conexión de NSURLConnectionWithRequest: delegate: method? Y lo siento, pero no veo ninguna mención de NSURLConnection o NSHTTPCookie en su pregunta. Confía en mí, todo lo que necesitas está en los enlaces que he dado. –

+0

Ya lo había usado, no funcionó, así que pensé que debe haber alguna otra forma de hacer una solicitud asíncrona ya que no hay ningún código de muestra para hacerlo. Aquí está el código que probé ... http://stackoverflow.com/questions/706355/whats-wrong-on-following-urlconnection –

+0

@Akash: NSURLConnection es la forma más fácil. Voy a publicar un código de muestra. –

3

Puedo a buscar galletas de tal manera:

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

Esta funciona bien para solicitud asíncrona también.

Cuestiones relacionadas