2016-03-29 4 views
2

Ich möchte Web Service für Swift 2 aufrufen. Aber es funktioniert nie. Das ist mein Code.Wie rufe ich einen SOAP-Webdienst in Swift 2 auf?

import UIKit 

class ViewController: UIViewController, UITextFieldDelegate, NSURLConnectionDelegate, NSXMLParserDelegate { 

    var mutableData:NSMutableData = NSMutableData.init() 
    var currentElementName:NSString = "" 



    @IBOutlet var txtCelsius : UITextField! 
    @IBOutlet var txtFahrenheit : UITextField! 


    @IBAction func actionConvert(sender : AnyObject) { 
     let celcius = txtCelsius.text 

     let soapMessage = "<?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.w3schools.com/xml/'><Celsius>\(celcius)</Celsius></CelsiusToFahrenheit></soap:Body></soap:Envelope>" 


     let urlString = "http://www.w3schools.com/xml/tempconvert.asmx" 

     let url = NSURL(string: urlString) 

     let theRequest = NSMutableURLRequest(URL: url!) 


     theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     theRequest.addValue((soapMessage), forHTTPHeaderField: "Content-Length") 
     theRequest.HTTPMethod = "POST" 
     theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) // or false 

     let connection = NSURLConnection(request: theRequest, delegate: self, startImmediately: true) 
     connection!.start() 


    } 




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

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



    func connection(connection: NSURLConnection!, didReceiveResponse response: NSURLResponse!) { 
     mutableData.length = 0; 
    } 

    func connection(connection: NSURLConnection!, didReceiveData data: NSData!) { 
     mutableData.appendData(data) 
    } 


    func connectionDidFinishLoading(connection: NSURLConnection!) { 
     let xmlParser = NSXMLParser(data: mutableData) 
     xmlParser.delegate = self 
     xmlParser.parse() 
     xmlParser.shouldResolveExternalEntities = true 

    } 


    func parser(parser: NSXMLParser, foundCharacters string: String) { 
     if currentElementName == "CelsiusToFahrenheit" { 
      txtFahrenheit.text = string 
     } 
    } 
+3

Bitte formatieren Sie Ihren Code und erklären Sie, was nicht stimmt. –

Antwort

8

NSURLConnection ist veraltet, NSURLSession stattdessen verwenden.

Hier ist ein Beispiel für eine Funktion mit NSURLSession und ein Rückruf zu tun, was Sie wollen:

func getFarenheit(celsius celsius: Int, completion: (result: String) -> Void) { 
    let soapMessage = "<?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.w3schools.com/xml/'><Celsius>\(celsius)</Celsius></CelsiusToFahrenheit></soap:Body></soap:Envelope>" 
    let urlString = "http://www.w3schools.com/xml/tempconvert.asmx" 
    if let url = NSURL(string: urlString) { 
     let theRequest = NSMutableURLRequest(URL: url) 
     theRequest.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
     theRequest.addValue((soapMessage), forHTTPHeaderField: "Content-Length") 
     theRequest.HTTPMethod = "POST" 
     theRequest.HTTPBody = soapMessage.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) 
     NSURLSession.sharedSession().dataTaskWithRequest(theRequest) { (data, response, error) in 
      if error == nil { 
       if let data = data, result = String(data: data, encoding: NSUTF8StringEncoding) { 
        completion(result: result) 
       } 
      } else { 
       print(error!.debugDescription) 
      } 
     }.resume() 
    } 
} 

Verwenden Sie es wie dies mit einem „Hinter Verschluss“:

getFarenheit(celsius: 42) { (result) in 
    print(result) 
} 

Es druckt die Daten enthält, die XML und der gewandelte Wert:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><CelsiusToFahrenheitResponse xmlns="http://www.w3schools.com/xml/"><CelsiusToFahrenheitResult>107.6</CelsiusToFahrenheitResult></CelsiusToFahrenheitResponse></soap:Body></soap:Envelope>

+0

Danke für Ihre Antwort. Ihr Code ist richtig, aber ich möchte nur 107.6 sehen. Wie kann ich das machen? –

+0

Gern geschehen. Meine Antwort zeigt Ihnen, wie Sie den Verbindungsteil reparieren, der Ihr Problem war. Jetzt müssen Sie den XML-Code analysieren und dafür können Sie weiterhin NSXMLParser verwenden, wie Sie es taten - Sie müssen nur die Daten verwenden, die von NSURLSession kommen, anstatt die Daten, die von den NSURLConnection-Delegaten kommen. :) – Moritz

Verwandte Themen