Sample code for 30+ languages & platforms
Objective-C

Asynchronous HTTP SOAP 1.2 Request and Response using POST

Demonstrates a working asynchronous SOAP 1.2 request and response using POST with a live server. You may try running this example with the URLs and data provided. See http://wsf.cdyne.com/WeatherWS/Weather.asmx?op=GetCityWeatherByZIP for details.

Note: This example is correct in theory, but no longer works for live testing because the SOAP service provider (cdyne.com) has made changes or discontinued the free service.

Chilkat Objective-C Downloads

Objective-C
// This is the interface header httpProgress.h
#import "CkoHttpProgress.h"

@interface httpProgress : CkoHttpProgress {
}

- (void)TaskCompleted:(CkoTask *)completedTask;
@end
// ----------------------------------------------------

#import <httpProgress.h>
@implementation httpProgress

- (void)TaskCompleted:(CkoTask *)completedTask
{
        //  A finished task could be one that was canceled, aborted, or truly finished.  

    //  If the task was "canceled", it was canceled prior to actually starting.  This could
    //  happen if the task was canceled while waiting in a thread pool queue to be scheduled by Chilkat's
    //  background thread pool scheduler.  

    //  If the task was "aborted", it indicates that it was canceled while running in a background thread.  
    //  The ResultErrorText will likely indicate that the task was aborted.

    //  If the task "completed", then it ran to completion, but the actual success/failure of the method
    //  is determined by the result obtained via a GetResult* method.  (A "completed" task will
    //  have a StatusInt equal to 7.   If the task finished, but was not completed, then it must've
    //  been aborted or canceled:
    if ([completedTask.StatusInt intValue] != 7) {
        NSLog(@"%@",@"Task did not complete.");
        NSLog(@"%@%@",@"task status: ",completedTask.Status);
        return;
    }

    //  The synchronous call to QuickGetObj would return an HTTP response object.  To get this 
    //  response object for the async call, we instantiate a new/empty HTTP response object,
    //  and then load it from the completed task.
    CkoHttpResponse *resp = [[CkoHttpResponse alloc] init];

    success = [resp LoadTaskResult: completedTask];
    if (success != YES) {
        NSLog(@"%@",resp.LastErrorText);
        return;
    }

    //  Now that we have the response, we can get all of the information:

    NSLog(@"%@%d",@"status code: ",[resp.StatusCode intValue]);
    NSLog(@"%@%@",@"response header: ",resp.Header);

    CkoXml *xmlResponse = [[CkoXml alloc] init];
    [xmlResponse LoadXml: resp.BodyStr];
    NSLog(@"%@",[xmlResponse GetXml]);
}

@end

// ----------------------------------------------------

#import <CkoHttpResponse.h>
#import <CkoXml.h>
#import <CkoHttp.h>
#import <CkoHttpRequest.h>
#import <CkoTask.h>

BOOL success = NO;

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

CkoHttp *http = [[CkoHttp alloc] init];
httpProgress *http_progress = [[httpProgress alloc] init];
[http setEventCallbackObject: http_progress];

CkoXml *soapXml = [[CkoXml alloc] init];

soapXml.Tag = @"soap12:Envelope";
[soapXml AddAttribute: @"xmlns:xsi" value: @"http://www.w3.org/2001/XMLSchema-instance"];
[soapXml AddAttribute: @"xmlns:xsd" value: @"http://www.w3.org/2001/XMLSchema"];
[soapXml AddAttribute: @"xmlns:soap12" value: @"http://www.w3.org/2003/05/soap-envelope"];

[soapXml NewChild2: @"soap12:Body" content: @""];
[soapXml GetChild2: [NSNumber numberWithInt: 0]];
[soapXml NewChild2: @"GetCityWeatherByZIP" content: @""];
[soapXml GetChild2: [NSNumber numberWithInt: 0]];
[soapXml AddAttribute: @"xmlns" value: @"http://ws.cdyne.com/WeatherWS/"];
[soapXml NewChild2: @"ZIP" content: @"60187"];
[soapXml GetRoot2];

NSLog(@"%@",[soapXml GetXml]);

CkoHttpRequest *req = [[CkoHttpRequest alloc] init];
req.HttpVerb = @"POST";
req.SendCharset = NO;
[req AddHeader: @"Content-Type" value: @"application/soap+xml; charset=utf-8"];
[req AddHeader: @"SOAPAction" value: @"http://ws.cdyne.com/WeatherWS/GetCityWeatherByZIP"];
req.Path = @"/WeatherWS/Weather.asmx";
[req LoadBodyFromString: [soapXml GetXml] charset: @"utf-8"];

http.FollowRedirects = YES;

CkoTask *task = [http SynchronousRequestAsync: @"wsf.cdyne.com" port: [NSNumber numberWithInt: 80] ssl: NO req: req];
if (http.LastMethodSuccess != YES) {
    NSLog(@"%@",http.LastErrorText);
    return;
}

//  Schedule the task for running on the thread pool.  This changes the task's state
//  from Inert to Live.
success = [task Run];
if (success != YES) {
    NSLog(@"%@",task.LastErrorText);

    return;
}

//  The application is now free to do anything else
//  while the HTTP request is in progress.  When the task
//  is completed, the TaskCompleted method is called.

//  -------------------------------------------------------------------------------
//  The following is a general note that applies to all programming languages:
//  -------------------------------------------------------------------------------

//  NOTE: This is very important:  The TaskCompleted callback runs in the background thread.  
//  (All callbacks from an async task, such as AbortCheck, PercentDone, ProgressInfo, etc. are in the background thread.) 
//  An application that uses TaskCompleted must be very careful.  
//  For example, user interface elements (such as labels, text boxes, etc.) may not be directly
//  accessible from a background thread, and could crash the application if directly accessed.  Also, attempting to debug
//  code running in a background thread from an IDE, especially an older IDE (such as VB6) is likely to crash the IDE.