couldDog
couldDog

Reputation: 182

SOAP request with XML response and body swift 3, Alamofire

I do not find any information about how to send SOAP request on swift 3. I have a SOAP API with XML. I use Alamofire as the net client at my project. My question is How to make SOAP request with XML on Swift, preferably with Alamofire library.

Upvotes: 3

Views: 5055

Answers (2)

Shakeeb Manjeri
Shakeeb Manjeri

Reputation: 130

use this extension to Alamofire. AlamofireSoap

Upvotes: 1

GayashanK
GayashanK

Reputation: 1215

I used following libraries

  pod 'Alamofire'
  pod 'SWXMLHash'
  pod 'AEXML'
  pod 'StringExtensionHTML'

Then you need to import

import SWXMLHash
import StringExtensionHTML
import AEXML
import Alamofire

This function works for me

 func getLines(){

        let soapRequest = AEXMLDocument()

        let envelopeAttributes = ["xmlns:soap":"http://schemas.xmlsoap.org/soap/envelope/", "xmlns:i" :"http://www.w3.org/2001/XMLSchema-instance","xmlns:d" : "http://www.w3.org/2001/XMLSchema","xmlns:c":"http://schemas.xmlsoap.org/soap/encoding/","xmlns:v":"http://schemas.xmlsoap.org/soap/envelope/"]

        let act : AEXMLElement = AEXMLElement(name: "n0:getAllStations", value: "", attributes: ["id":"o0","c:root":"1", "xmlns:n0":"http://ws.wso2.org/dataservice"])
        let child1 : AEXMLElement = AEXMLElement(name: "lang", value: "en", attributes: ["i:type":"d:string"])

        act.addChild(child1)

        let envelope = soapRequest.addChild(name: "soap:Envelope", attributes: envelopeAttributes)
        envelope.addChild(name :"soap:Header")
        let body = envelope.addChild(name: "soap:Body")
        body.addChild(act)

        let soapLenth = String(soapRequest.xml.characters.count)
        let theURL = URL(string: "http://103.11.35.13:9080/services/RailwayWebServiceV2Proxy.RailwayWebServiceV2ProxyHttpSoap12Endpoint")

        print(soapRequest.xml)

        var mutableR = URLRequest(url: theURL!)
        mutableR.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
        mutableR.addValue(soapLenth, forHTTPHeaderField: "Content-Length")
        mutableR.addValue("getAllStations", forHTTPHeaderField: "SOAPAction")
        mutableR.httpMethod = "POST"
        mutableR.httpBody = soapRequest.xml.data(using: String.Encoding.utf8)

        Alamofire.request(mutableR)
            .responseString { response in
                if let xmlString = response.result.value {

                    let xml = SWXMLHash.parse(xmlString)

                    for element in xml["soapenv:Envelope"]["soapenv:Body"]["datas1:lines"]["datas1:line"].all {

                        if let nameElement = element["datas1:id"].element {
                            let line = Lines()
                            line.id = Int(nameElement.text)
                            self.lines.append(line)
                        }

                        if let nameElement = element["datas1:LineName"].element {
                            let line = Lines()
                            line.LineName = nameElement.text
                            self.lines.append(line)
                        }

                    }

                }else{
                    print("error fetching XML")
                }
        }

    }

Upvotes: 3

Related Questions