Objective-C Asynchronous Web Request with Cookies

前端 未结 3 1910
半阙折子戏
半阙折子戏 2020-11-28 21:44

I am writing a program in Objective-C and I need to make web requests to web server, but asynchronously and I am fairly new on mac, I am very good at windows technologies, b

相关标签:
3条回答
  • 2020-11-28 22:07

    I am able to fetch cookie in such way:

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

    This one works fine for asynchronous request as well.

    0 讨论(0)
  • 2020-11-28 22:22

    There's a good example of using NSURLRequest and NSHTTPCookies to do a full web application example of logging into a website, storing the SessionID cookie and resubmitting it in future requests.

    NSURLConnection, NSHTTPCookie

    By 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 讨论(0)
  • 2020-11-28 22:27

    For asynchronous requests, you need to use NSURLConnection.

    For cookies, see NSHTTPCookie and NSHTTPCookieStorage.

    UPDATE:

    The code below is real, working code from one of my applications. responseData is defined as NSMutableData* in the class interface.

    - (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];
    }
    
    0 讨论(0)
提交回复
热议问题