Skip to content

Instantly share code, notes, and snippets.

@JFSene
Forked from dethbiscuit/Swift and Soap Web Service
Created November 23, 2016 16:10
Show Gist options
  • Save JFSene/69d5eb6a3c91a209583407e14eb68955 to your computer and use it in GitHub Desktop.
Save JFSene/69d5eb6a3c91a209583407e14eb68955 to your computer and use it in GitHub Desktop.
Swift and Soap Web Service
//
// Call a soap web service
//
// Add
// NSURLConnectionDelegate
// NSXMLParserDelegate
class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, NSURLConnectionDelegate, NSXMLParserDelegate{
@IBOutlet weak var mapKit: MKMapView!
var wsUrl : String = "http://mobilewebservice.greenmotion.ch/MobileEvpass.asmx"
var mutableData:NSMutableData = NSMutableData.alloc()
var currentElementName:NSString = ""
var lastElementName:NSString = ""
let lastNodeName = "Latitude"
let firstNodeName = "Longitude"
var chargingStation = ChargingStation()
var chargingStations = [ChargingStation]()
override func viewDidLoad() {
super.viewDidLoad()
// Web services
var date = NSDate().ToShortDateTime()
var password = "656214CDD7C0782AF86531326D0AE048"
var hash = (password+date).MD5()
var methodName = "GetChargingStationsList"
var userId = 1
var text = String(format: "<?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><%@ xmlns='http://tempuri.org/'><userId>%d</userId><date>%@</date><hash>%@</hash></%@></soap:Body></soap:Envelope>", methodName, userId, date, hash, methodName)
var soapMessage = text
var url = NSURL(string: wsUrl)
var theRequest = NSMutableURLRequest(URL: url!)
var msgLength = String(countElements(soapMessage))
theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
theRequest.addValue(msgLength, forHTTPHeaderField: "Content-Length")
theRequest.HTTPMethod = "POST"
theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) // or false
var connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: true)
connection?.start()
if(connection == true){
var mutableData : Void = NSMutableData.initialize()
}
}
// MARK: - Web Service
func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
mutableData.length = 0;
}
func connection(connection: NSURLConnection!, didReceiveData data: NSData!) {
mutableData.appendData(data)
}
// Parse the result right after loading
func connectionDidFinishLoading(connection: NSURLConnection!) {
println(mutableData)
var xmlParser = NSXMLParser(data: mutableData)
xmlParser.delegate = self
xmlParser.shouldProcessNamespaces = false
xmlParser.shouldReportNamespacePrefixes = false
xmlParser.shouldResolveExternalEntities = false
xmlParser.parse()
}
// NSXMLParserDelegate
// Operation to do when a new element is parsed
func parser(parser: NSXMLParser!, didStartElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!, attributes attributeDict: NSDictionary!) {
if(elementName != nil){
lastElementName = currentElementName
currentElementName = elementName
if(elementName == firstNodeName){
chargingStation = ChargingStation()
}
}
println(String(format : "didStartElement / elementName %@", elementName))
}
// Operations to do for each element
func parser(parser: NSXMLParser!, foundCharacters string: String!) {
println(String(format : "foundCharacters / value %@", string))
if(string != nil){
if currentElementName == "Longitude" {
chargingStation.longitude = (string as NSString).doubleValue
}
if currentElementName == "Latitude" {
chargingStation.latitude = (string as NSString).doubleValue
}
}
}
// Add the data to a mutable array of objects
func parser(parser: NSXMLParser!, didEndElement elementName: String!, namespaceURI: String!, qualifiedName qName: String!) {
println(String(format : "didEndElement / elementName %@", elementName))
if(elementName == lastNodeName){
chargingStations.append(chargingStation)
}
}
// Operations to do when the result has been parsed
func parserDidEndDocument(parser: NSXMLParser!) {
println("parserDidEndDocument")
println(chargingStations.count)
println("parserDidEndDocument")
addAnnotations()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment