Reputation: 182
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
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