2016-11-25 2 views
-3

Я новичок в iOS. У меня есть некоторые впечатления от Android. У меня проблема с использованием веб-службы в Swift. Я много гугл, но я не могу быть успешным. Я использую Swift 3.0 и iOS 10.1. У меня есть некоторая информация о веб-сервисе в iOS, потому что я очень много разбираюсь, а затем написал этот код. Но ярлык lblSonuc уже «Ярлык». К сожалению, я не верю.iOS - Мой код веб-сервиса не работает в Swift 3

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

@IBAction func btnDeneme(_ sender: Any) { 
    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>10</Celsius></CelsiusToFahrenheit></soap:Body></soap:Envelope>" 

    let url = "http://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit" 

    let urlStr = NSURL(string: url) 

    let request = NSMutableURLRequest(url: urlStr as! URL) 

    let msgLength = soapMessage.characters.count 

    request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
    request.addValue("http://tempuri.org/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction") 
    request.addValue(String(msgLength), forHTTPHeaderField: "Content-Length") 

    request.httpMethod = "POST" 

    request.httpBody = soapMessage.data(using: String.Encoding.utf8, allowLossyConversion: false) 

    let connection = NSURLConnection.init(request: request as URLRequest, delegate: self) 


} 

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


private func connection(connection: NSURLConnection!, didReceiveData data: Data!) { 
    mutableData.append(data) 
    lblSonuc.text = String(describing: data) } 



func connectionDidFinishLoading(connection: NSURLConnection!){ 
    let response = NSString(data: mutableData as Data, encoding: String.Encoding.utf8.rawValue) 
    lblSonuc.text = response as String? 
    //let xmlParser = XMLParser(data: mutableData as Data) 
    //xmlParser.delegate = self 
    //xmlParser.parse() 
    //xmlParser.shouldResolveExternalEntities = true; 
+0

Я пытался опубликовать свой пример с клиентом SOAP, и я получил отказ «Сервер не распознает значение HTTP заголовка SOAPAction: http://tempuri.org/CelsiusToFahrenheit ".попробуйте ввести соединение с событием (_: didFailWithError :), чтобы узнать, какая ошибка вы получили – Yaman

ответ

0

Хорошо, поэтому вы делаете здесь 2 основных ошибки. Во-первых, вам нужно «ПОЛУЧИТЬ» переменную в вашем soapMessage через http. Вы делаете это:

let soapMessage: "soap" 
let msgLength = soapMessage.characters.count 
NSLog(msgLength) 
// msgLength is equal to 4 because it has 4 characters! 

Вы должны поместить его в правильное содержание, а затем запросить данные из базы данных, веб-сайт, проект или что когда-либо вы хотите, чтобы вытащить данные.

Вот как вы можете "POST" что-то в Swift 3, например:

let URLThatYouWantToRequest = NSURL(string: "https://website-address.com/something")! 
let request = NSMutableURLRequest(url: URLThatYouWantToRequest as URL) 
request.httpBody = "item1=value1&item2=value2".data(using: String.Encoding.utf8) 
    request.httpMethod = "POST" 

Вы можете также получить такие данные:

let URLThatYouWantToRequest = NSURL(string: "https://website-address/something")! 
let getRequest = NSMutableURLRequest(url: URLThatYouWantToRequest as URL) 
getRequest.setValue("text/plain", forHTTPHeaderField: "Accept") 
URLSession.shared.dataTask(with: getRequest as URLRequest) { (data, response, error) -> Void in 
    let soapMessage = String(data: data!, encoding: String.Encoding.utf8) 
    let msgLength = soapMessage.characters.count 
    NSLog(msgLength) 
    }.resume() 
0

Выдать мыло 1.1 запрос:

let celcius = 10.0 

let bodyString = "<?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>" 

var request = URLRequest(url: URL(string: "http://www.w3schools.com/xml/tempconvert.asmx")!) 
request.httpMethod = "POST" 
request.httpBody = bodyString.data(using: .utf8) 
request.setValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type") 
request.addValue("http://www.w3schools.com/xml/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction") 

let task = URLSession.shared.dataTask(with: request) { data, response, error in 
    guard let data = data, error == nil else { 
     print("network error: \(error)") 
     return 
    } 

    let parser = XMLParser(data: data) 
    parser.delegate = self 
    guard parser.parse() else { 
     print("parsing error: \(parser.parserError)") 
     return 
    } 

    // if we've gotten here, update the UI 

    DispatchQueue.main.async { 
     if let fahrenheitValue = self.fahrenheitValue { 
      self.lblSonuc.text = "\(fahrenheitValue)" 
     } else { 
      self.lblSonuc.text = "No fahrenheit value found?!?" 
     } 
    } 
} 
task.resume() 

Примечание:

  1. Не используйте NSURL или NSMutableURLRequest. Используйте URL и URLRequest напрямую.

  2. Не используйте устаревшие NSURLConnection. Используйте URLSession. (. Это на самом деле проще)

  3. Если вы собираетесь сделать запрос SOAP, вам придется разобрать ответ XML, например:

    var fahrenheitValue: Double? 
    var elementValue: String? 
    

    и

    extension ViewController: XMLParserDelegate { 
    
        func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { 
         if elementName == "CelsiusToFahrenheitResult" { 
          elementValue = "" 
         } 
        } 
    
        func parser(_ parser: XMLParser, foundCharacters string: String) { 
         elementValue? += string 
        } 
    
        func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
         if elementName == "CelsiusToFahrenheitResult" { 
          fahrenheitValue = Double(elementValue!) 
          elementValue = nil 
         } 
        } 
    } 
    
  4. На http://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit, они показывают вам, что должно выглядеть тело и заголовки запроса. Когда я использовал их выше, он работал нормально.

    Единственное, что вам не нужно устанавливать заголовок Content-Length, так как URLSession делает это за вас.

  5. Убедитесь, что у вас есть обработка ошибок, обнаружение ошибок сети и/или синтаксического анализа, как показано выше. Не глядя на объекты с ошибкой, вы летели слепым.

  6. Единственный трюк в том, что вы должны отредактировать свой Info.plist, чтобы разрешить запрос без https, например. редактировать источник Info.plist и добавьте следующую key/dict пары:

    <key>NSAppTransportSecurity</key> 
    <dict> 
        <key>NSExceptionDomains</key> 
        <dict> 
         <key>w3schools.com</key> 
         <dict> 
          <!--Include to allow subdomains--> 
          <key>NSIncludesSubdomains</key> 
          <true/> 
          <!--Include to allow HTTP requests--> 
          <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> 
          <true/> 
          <!--Include to specify minimum TLS version--> 
          <key>NSTemporaryExceptionMinimumTLSVersion</key> 
          <string>TLSv1.1</string> 
         </dict> 
        </dict> 
    </dict> 
    
+0

func parser (_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String ?, qualifiedName qName: String?) { if elementName == "CelsiusToFahrenheitResult "{ fahrenheitValue = Double (elementValue!) elementValue = ноль } } у меня есть результат, как faultCode для ELEMENTNAME, так что я не получаю истинное значение fahrenheitValue, так что мой лейбл, lblSonuc, является "Sonuç йок" , Как я могу решить эту проблему? –

+0

Я проверил этот веб-сервис в браузере, теперь он не работает! Какая удача! Я думаю, я не могу получить правильный результат из-за этого сейчас. Если это сработает, я могу получить правильный результат, может быть .. –

Смежные вопросы