Sample code for 30+ languages & platforms
Objective-C

HTTP GET -- Read Response from Stream

See more REST Examples

Demonstrates how to send an HTTP GET for a web page, and then read the response from a Stream. The purpose is to fulfill a situation such as the following: "I have a URL and just want the <head> </head> portion of the HTML. This would avoid having to download a potentially enormous web page just to get at header information, such as the <styles>."

Chilkat Objective-C Downloads

Objective-C
#import <CkoRest.h>
#import <CkoUrl.h>
#import <NSString.h>
#import <CkoStream.h>
#import <CkoTask.h>
#import <CkoStringBuilder.h>

BOOL success = NO;

// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.

CkoRest *rest = [[CkoRest alloc] init];

// In this example, we'll get the web page at http://www.nytimes.com/pages/business/index.html
// The domain is "www.nytimes.com", and the path is "/pages/business/index.html"

// If we have only the full URL to begin with, it can be loaded into the Chilkat URL object to
// access the parts:
CkoUrl *url = [[CkoUrl alloc] init];
[url ParseUrl: @"http://www.nytimes.com/pages/business/index.html"];

BOOL bAutoReconnect = YES;
success = [rest Connect: url.Host port: url.Port tls: url.Ssl autoReconnect: bAutoReconnect];

// Send the GET request (This sends the GET request, but does not read the response.)
success = [rest SendReqNoBody: @"GET" uriPath: url.Path];
if (success != YES) {
    NSLog(@"%@",rest.LastErrorText);
    return;
}

// Read the response header.
int responseStatusCode = [[rest ReadResponseHeader] intValue];
if (responseStatusCode < 0) {
    NSLog(@"%@",rest.LastErrorText);
    return;
}

NSLog(@"%@%d",@"Response status code = ",responseStatusCode);

// We expect a 200 response status.
if (responseStatusCode != 200) {

    // If the response status code is not 200, we could check for a redirect status code and 
    // then follow it, read the entire response (as shown here), or just call rest.Disconnect
    NSString *errResponse = [rest ReadRespBodyString];
    if (rest.LastMethodSuccess != YES) {
        NSLog(@"%@",rest.LastErrorText);
    }
    else {
        NSLog(@"%@",errResponse);
    }

    return;
}

CkoStream *bodyStream = [[CkoStream alloc] init];
// Set a 10 second read timeout for the stream. 
// (Give up if no data arrives within 10 seconds after calling a read method.)
bodyStream.ReadTimeoutMs = [NSNumber numberWithInt:10000];

// Create a background thread task to read the response body (which feeds
// it to the bodyStream object.)
CkoTask *readResponseBodyTask = [rest ReadRespBodyStreamAsync: bodyStream autoSetStreamCharset: YES];

// Start the task. 
success = [readResponseBodyTask Run];

// Read the HTTP response body until the "</head>" is seen, or until
// the end-of-stream is reached.

CkoStringBuilder *sbBody = [[CkoStringBuilder alloc] init];
BOOL exitLoop = NO;
while (!exitLoop && (bodyStream.EndOfStream != YES)) {

    NSString *bodyText = [bodyStream ReadString];
    if (bodyStream.LastMethodSuccess == YES) {
        [sbBody Append: bodyText];
        if ([sbBody Contains: @"</head>" caseSensitive: NO]) {
            exitLoop = YES;
        }

    }
    else {
        exitLoop = YES;
    }

}

// Cancel the remainder of the task...
[readResponseBodyTask Cancel];

// Ensure we're disconnected from the server.
int maxWaitMs = 50;
[rest Disconnect: [NSNumber numberWithInt: maxWaitMs]];

NSLog(@"%@",@"----");
NSLog(@"%@",[sbBody GetAsString]);
NSLog(@"%@",@"----");
NSLog(@"%@",@"Successfully received the body up to the desired point.");