Я хочу вызвать или отправить запрос в мой php-веб-сервис, который генерирует ответ в формате xml, и мне нужно проанализировать эти данные, чтобы получить звуковую ссылку, и отправить ее плееру.
Я написал код ниже, но когда я отлаживаю его, ответ не возвращается.
любое предложение?
var soapMsg = "<?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<getSounds xmlns=\"http://test.com/soap/tv\"><Language></Language></getSounds></soap:Body></soap:Envelope>"
let urlString: String = "http://test.com/tv/soapServices.php?wsdl"var url: NSURL = NSURL(string: urlString)!
//var request: NSURLRequest = NSURLRequest(URL: url)
var request = NSMutableURLRequest(URL: url)
var msgLength = String(soapMsg.characters.count)
request.HTTPMethod = "POST"request.HTTPBody = soapMsg.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
request.addValue(msgLength, forHTTPHeaderField: "Content-Length")
request.addValue("http://bee.myservice.com/userLogin", forHTTPHeaderField: "Action")var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: true)!
connection.start()
print(request)
var response: NSURLResponse?
// var data = NSURLConnection.sendSynchronousRequest(request, returningResponse: &response, error: nil) as NSData?
do{
var data = try NSURLConnection.sendSynchronousRequest(request , returningResponse: &response)
if let httpResponse = response as? NSHTTPURLResponse {
// print(<#T##items: Any...##Any#>)("error \(httpResponse.statusCode)")
print(response)
}
}
catch{
print("error")
}
реализовать методы делегата,
func connection(didReceiveResponse: NSURLConnection!, didReceiveResponse response: NSURLResponse!) {
// Recieved a new request, clear out the data object
self.data = NSMutableData()
}
func connection(connection: NSURLConnection!, didReceiveData conData: NSData!) {
// Append the recieved chunk of data to our data object
// If the connection is receiving some data
self.data.appendData(conData)
}
func connectionDidFinishLoading(connection: NSURLConnection!) {
// Request complete, self.data should now hold the resulting info
let responseString: NSString = NSString(data: self.responseData, encoding: NSUTF8StringEncoding);
println(responseString)
}
Здесь self.data — это переменная типа NSMutableData (), в которой хранится XML-ответ. если все работает нормально, responseString должен напечатать XML.
P.S не забудь это
class YourClass : NSObject, NSURLConnectionDelegate
В вашем коде есть ошибка,
Вы должны использовать делегат метод
Для получения ответа вы должны написать делегат метод в NSURLConnection.
Спасибо..
Я нашел решение для своего вопроса, и я подумал, что поделюсь им с другими, кто хочет его использовать.
Я использовал SOAPEngine для обработки запросов на мыло. Github и вот как я использовал его в Swift 2:
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var SoundTitle:NSArray = [NSArray]()
var soundfile:NSArray = [NSArray]()
var soap = [SOAPEngine]()
@IBOutlet var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let soap = SOAPEngine()
soap.userAgent = "SOAPEngine"soap.actionNamespaceSlash = true
soap.licenseKey = "eJJDzkPK9Xx+p5cOH7w0Q+AvPdgK1fzWWuUpMaYCq3r1mwf36Ocw6dn0+CLjRaOiSjfXaFQBWMi+TxCpxVF/FA=="//soap.responseHeader = true // use only for non standard MS-SOAP service
// soap.setValue("1", forKey: "Language")//sending post variables to field one
soap.setIntegerValue(1, forKey: "Language")//sending post variable to field two
soap.requestURL("http://test.com/tv/soapServices.php",
soapAction: "http://test.com/tv/soapServices.php/getSounds",
completeWithDictionary: { (statusCode : Int, dict : [NSObject : AnyObject]!) -> Void in
var book:Dictionary = dict as Dictionary
// print(book)
// print(book["Title"])
let soundfile : NSArray = book["SoundPath"] as! NSArray
let SoundTitle : NSArray = book["Title"] as! NSArray
self.soundfile = soundfile
self.SoundTitle = SoundTitle
self.table.reloadData()}) { (error : NSError!) -> Void in
NSLog("%@", error)
}
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.soundfile.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell? = self.table.dequeueReusableCellWithIdentifier("cell") as UITableViewCell?
if cell == nil
{
cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "cell")
}
let sound_file : String = self.soundfile[indexPath.row] as! String
let sound_title : String = self.SoundTitle[indexPath.row] as! Stringcell!.textLabel?.text = sound_title
cell!.textLabel!.textAlignment = .Right
cell!.detailTextLabel?.text = sound_filereturn cell!
}
}