IOS Swift Call Web Service using SOAP

So i was being silly. The main thing was that I missed setting the body of the message to the SOAP request. My updated corrected code is below:

//  ViewController.swift
//  TestWebServiceSoap
//  Created by George M. Ceaser Jr on 6/2/15.
//  Copyright (c) 2015 George M. Ceaser Jr. All rights reserved.

import UIKit

class ViewController: UIViewController {
var is_SoapMessage: String = "<soapenv:Envelope xmlns:soapenv=\"\" xmlns:cgs=\"\"><soapenv:Header/><soapenv:Body><cgs:GetSystemStatus/></soapenv:Body></soapenv:Envelope>"

override func viewDidLoad() {
    // Do any additional setup after loading the view, typically from a nib.

override func didReceiveMemoryWarning() {
    // Dispose of any resources that can be recreated.

@IBAction func btnClicked(sender: AnyObject)
    var is_URL: String = ""

    var lobj_Request = NSMutableURLRequest(URL: NSURL(string: is_URL)!)
    var session = NSURLSession.sharedSession()
    var err: NSError?

    lobj_Request.HTTPMethod = "POST"
    lobj_Request.HTTPBody = is_SoapMessage.dataUsingEncoding(NSUTF8StringEncoding)
    lobj_Request.addValue("", forHTTPHeaderField: "Host")
    lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
    lobj_Request.addValue(String(count(is_SoapMessage)), forHTTPHeaderField: "Content-Length")
    //lobj_Request.addValue("223", forHTTPHeaderField: "Content-Length")
    lobj_Request.addValue("", forHTTPHeaderField: "SOAPAction")

    var task = session.dataTaskWithRequest(lobj_Request, completionHandler: {data, response, error -> Void in
        println("Response: \(response)")
        var strData = NSString(data: data, encoding: NSUTF8StringEncoding)
        println("Body: \(strData)")

        if error != nil
            println("Error: " + error.description)



Swift 5.2, XCode 12

I followed more or less the approach that George did on his self response. I think that leaving a sample of code with the latest swift and Xcode may be helpful for some:

private func exampleSoapRequest() {
    let url = URL(string: ProvidedData.urlString)!
    let request = NSMutableURLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = .utf8)
    request.addValue(String(ProvidedData.envelope.count), forHTTPHeaderField: "Content-Length")
    request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
    request.addValue("<PUT HERE YOUR SOAP ACTION IF NEEDED>", forHTTPHeaderField: "SOAPAction")

    let task = URLSession.shared
        .dataTask(with: request as URLRequest,
                  completionHandler: { data, response, error in
                    guard error == nil else {
                        // Handle the error

                    guard let data = data else {
                    // Continue checking response or data...

In the ProvidedData, I just assumed you're gonna pass somehow your url and envelope.

In addition to that, if you want to have a more structured and "parameter based" envelope and you don't mind using external libraries, the solution with AEXML proposed by @Pulkit Kumar Singh is also quite interesting.