Objective-C
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
#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.");