How to access SOAP services from iPhone

149,747

Solution 1

One word: Don't.

OK obviously that isn't a real answer. But still SOAP should be avoided at all costs. ;-) Is it possible to add a proxy server between the iPhone and the web service? Perhaps something that converts REST into SOAP for you?

You could try CSOAP, a SOAP library that depends on libxml2 (which is included in the iPhone SDK).

I've written my own SOAP framework for OSX. However it is not actively maintained and will require some time to port to the iPhone (you'll need to replace NSXML with TouchXML for a start)

Solution 2

My solution was to have a proxy server accept REST, issue the SOAP request, and return result, using PHP.

Time to implement: 15-30 minutes.

Not most elegant, but solid.

Solution 3

I've historically rolled my own access at a low level (XML generation and parsing) to deal with the occasional need to do SOAP style requests from Objective-C. That said, there's a library available called SOAPClient (soapclient) that is open source (BSD licensed) and available on Google Code (mac-soapclient) that might be of interest.

I won't attest to it's abilities or effectiveness, as I've never used it or had to work with it's API's, but it is available and might provide a quick solution for you depending on your needs.

Apple had, at one time, a very broken utility called WS-MakeStubs. I don't think it's available on the iPhone, but you might also be interested in an open-source library intended to replace that - code generate out Objective-C for interacting with a SOAP client. Again, I haven't used it - but I've marked it down in my notes: wsdl2objc

Solution 4

Here is a swift 4 sample code which execute API calling using SOAP service format.

   func callSOAPWSToGetData() {

        let strSOAPMessage =
            "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
                "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
                "<soap:Body>" +
                "<CelsiusToFahrenheit xmlns=\"http://www.yourapi.com/webservices/\">" +
                "<Celsius>50</Celsius>" +
                "</CelsiusToFahrenheit>" +
                "</soap:Body>" +
        "</soap:Envelope>"

        guard let url = URL.init(string: "http://www.example.org") else {
            return
        }
        var request = URLRequest.init(url: url)
        let length = (strSOAPMessage as NSString).length
        request.addValue("application/soap+xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        request.addValue("http://www.yourapi.com/webservices/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction")
        request.addValue(String(length), forHTTPHeaderField: "Content-Length")
        request.httpMethod = "POST"
        request.httpBody = strSOAPMessage.data(using: .utf8)

        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        let task = session.dataTask(with: request) { (data, response, error) in
            guard let responseData = data else {
                print("Error: did not receive data")
                return
            }
            guard error == nil else {
                print("error calling GET on /todos/1")
                print(error ?? "")
                return
            }
            print(responseData)
            let strData = String.init(data: responseData, encoding: .utf8)
            print(strData ?? "")
        }
        task.resume()
    }

Solution 5

You can connect using a tool that I found http://www.wsdl2code.com

SampleServiceProxy *proxy = [[SampleServiceProxy alloc]initWithUrl:@"YOUR
        URL" AndDelegate:self];

[proxy GetDouble];
[proxy GetEnum];
[proxy getEnum:kTestEnumTestEnum2];
[proxy GetInt16];
[proxy GetInt32];
[proxy GetInt64];
[proxy GetString];
[proxy getListStrings];
Share:
149,747

Related videos on Youtube

Willo Sonico
Author by

Willo Sonico

Updated on December 26, 2020

Comments

  • Willo Sonico
    Willo Sonico over 3 years

    I'm planning to develop an app for the iPhone and that app would have to access a couple of SOAP services. While doing some basic checking in the iPhone SDK I was not able to find any support for accessing SOAP services, a bit of Googling lead to the conclusion that there is no support for SOAP in the iPhone SDK.

    So if I do want to build that app I'll need to come up with a approach to access SOAP services from the iPhone. What would be the best approach? Any best practices? Did someone already write a library using the functionality that is present in the iPhone SDK to access SOAP services?

    (Since the service I need to access is exposed by another party and they only expose it as SOAP, it's unfortunately not an option to switch to another type of interface (e.g. REST based API).

    Gero

    • Ameya
      Ameya over 13 years
      Hi Gero, What soap service did u use for ur application. as u have not mentioned any answers correct.
    • Vineesh TP
      Vineesh TP over 11 years
      After you use the service please post the tutorials for future reference for Others.
  • Willo Sonico
    Willo Sonico over 15 years
    Thanks, I tried to use wsdl2objc. The generation of ObjectiveC code from the WSDL works, but is (as expected) does not directly compile against iPhone SDK. I tried to tweak the sources a bit, but ended up with a bunch of errors I could not resolve
  • WillF
    WillF almost 15 years
    Can you elaborate on this statement "But still SOAP should be avoided at all costs"
  • senfo
    senfo about 14 years
    If you don't mind, I'd really like an explanation to go along with this response. Also, when you say "converts REST into SOAP for you" I think you meant convert JSON into SOAP. Is this correct?
  • Erik Hermansen
    Erik Hermansen about 14 years
    Yeah, also wanting the explanation. If you just say "Don't", I want to know if you are basing it on something specific you know about iPhone/SOAP problems. On the other hand, if it's just the normal, general reasons for avoiding SOAP, I can Google "SOAP vs REST" and get a firehose mouthful of that.
  • Anthony Main
    Anthony Main over 13 years
    Just cause soap is not necessarily appropriate doesnt mean its not right in his implementation, there are needs that go beyond best practive more often than not
  • DougW
    DougW over 13 years
    @schwa - Downvoted for posting a potentially useful answer with absolutely no supporting evidence or defense.
  • Anya Shenanigans
    Anya Shenanigans over 13 years
    This is the technical equivalent of "Don't use it because It's not provided by default" - There is no real technical reason why you should not use SOAP or any other mechanism that is provided by a service.
  • Spring
    Spring almost 13 years
    How did you that? any documents. tnx
  • jer
    jer over 12 years
    Upvoted because it's absolutely right. The benefits of using SOAP outweigh its costs in terms of complexity, overhead, etc., when compared with other methods available.
  • Vineel Shah
    Vineel Shah over 11 years
    Here's at least an answer-- SOAP is a very high-overhead protocol compared to REST. All the namespacing and validity checking and such adds a ton of extra characters to your message, and this is exactly what you want to avoid over a high-latency, potentially slow network, such as 3G. If you can guarantee that your app will only be used in a 4g environment with excellent signal, or only in Wifi, it might be more approriate. But in general with mobile networking, less is more.
  • bvanvelsen
    bvanvelsen over 10 years
    Sometimes you simply cannot avoid using SOAP. For instance you are building an iOS or Android client, connecting to a SOAP webservice, if you have no control over the service, then you must provide a SOAP implementation.
  • gdbj
    gdbj over 8 years
    I love the mysterious non-answer. how was this upvoted?
  • Magic Octopus Urn
    Magic Octopus Urn about 7 years
    @gdbj because a 1:1 conversion between REST and SOAP should be self-explanitory...
  • gdbj
    gdbj about 7 years
    That's the What, but doesn't answer the question of How, which is why people come here. I'm still curious on the answer on what the implementation would be here, particularly if it is so simple.