我在我的应用程序中调用一个soap服务。我从服务器获得JSON的响应
{
"CustomerName":"Muneer Ahmad/ Ejaz Ahmad (User) ",
"IsCorporate":false,
"ID":48,
"Name":"Muneer Ahmad/ Ejaz Ahmad (User) ",
"GroupID":null,
"GroupName":null,
"CustomerID":48
}我尝试过在线教程的建议,但我无法解析数据。它给我的错误是“字符0周围的无效值”。我的密码是
let is_URL: String = "http://labs2.unitedtracker.com/WTService.asmx?op=GetTerminalNumber"
let lobj_Request = NSMutableURLRequest(url: NSURL(string: is_URL)! as URL)
let session = URLSession.shared
lobj_Request.httpMethod = "POST"
lobj_Request.httpBody = is_SoapMessage.data(using: String.Encoding.utf8)
lobj_Request.addValue("labs2.unitedtracker.com", forHTTPHeaderField: "Host")
lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
lobj_Request.addValue(String(is_SoapMessage.characters.count), forHTTPHeaderField: "Content-Length")
lobj_Request.addValue("http://tempuri.org/GetTerminalNumber", forHTTPHeaderField: "SOAPAction")
let task = session.dataTask(with: lobj_Request as URLRequest, completionHandler: {data, response, error -> Void in
do {
if let data = data,
let json = try JSONSerialization.jsonObject(with: data) as? [String: Any],
let customerID = json["CustomerID"] as? [[String: Any]] {
print(customerID)
}
} catch {
print("Error deserializing JSON: \(error)")
}
if error != nil
{
print("Error: " + String(describing: error))
}
})
task.resume()有人能告诉我我在做什么不对吗?应该如何解析Soap服务的JSON响应。
以下是来自我的服务器的完整响应。
<?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><GetAuthenticateUserResponse xmlns="http://tempuri.org/"><GetAuthenticateUserResult>[{"CustomerName":"Muneer Ahmad/ Ejaz Ahmad (User) ","IsCorporate":false,"ID":48,"Name":"Muneer Ahmad/ Ejaz Ahmad (User) ","GroupID":null,"GroupName":null,"CustomerID":48}]</GetAuthenticateUserResult></GetAuthenticateUserResponse></soap:Body></soap:Envelope>发布于 2017-06-08 09:32:58
lobj_Request.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")如何保证服务器将返回json作为响应?它似乎将返回text/xml作为响应。
关于JSON解析,我建议使用SwiftyJSON。
更多建议
几年前,我曾经使用过soap客户端引擎,它会将wsdl解析为objective-c代码。今天,也许有些工具可以帮助您从Swift生成wsdl代码,以便与soap服务器进行通信。
关于wsdl到快速客户端生成器
发布于 2017-06-08 11:38:59
问题是您从服务器接收XML并尝试将其解析为JSON。您必须首先从XML信封中提取JSON有效负载。以下是整个回应:
<?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>
<GetAuthenticateUserResponse xmlns="http://tempuri.org/">
<GetAuthenticateUserResult>[{"CustomerName":"Muneer Ahmad/ Ejaz Ahmad (User) ","IsCorporate":false,"ID":48,"Name":"Muneer Ahmad/ Ejaz Ahmad (User) ","GroupID":null,"GroupName":null,"CustomerID":48}]</GetAuthenticateUserResult>
</GetAuthenticateUserResponse>
</soap:Body>
</soap:Envelope>您需要将<GetAuthenticateUserResult>标记的内容提取为字符串,只有这样,您才能使用NSJSONSerialization来解析该内容。有点像这样:
class Extractor: NSObject, XMLParserDelegate {
var payload = ""
private var recording = false
let wantedElement = "GetAuthenticateUserResult"
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?,
qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
if elementName == wantedElement {
recording = true
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
if recording {
payload += string
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
recording = false
}
}
let response = "<?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><GetAuthenticateUserResponse xmlns=\"http://tempuri.org/\"><GetAuthenticateUserResult>[{\"CustomerName\":\"Muneer Ahmad/ Ejaz Ahmad (User)\",\"IsCorporate\":false,\"ID\":48,\"Name\":\"Muneer Ahmad/ Ejaz Ahmad (User) \",\"GroupID\":null,\"GroupName\":null,\"CustomerID\":48}]</GetAuthenticateUserResult></GetAuthenticateUserResponse></soap:Body></soap:Envelope>"
let parser = XMLParser(data: response.data(using: .utf8)!)
let extractor = Extractor()
parser.delegate = extractor
parser.parse()
let payload = extractor.payload
let parsedPayload = try? JSONSerialization.jsonObject(with: payload.data(using: .utf8)!, options: [])这给了你:
{
CustomerID = 48;
CustomerName = "Muneer Ahmad/ Ejaz Ahmad (User)";
GroupID = "<null>";
GroupName = "<null>";
ID = 48;
IsCorporate = 0;
Name = "Muneer Ahmad/ Ejaz Ahmad (User) ";
}XML提取代码有点愚蠢,因为我不知道有什么更好的内置XML解析器。
发布于 2017-06-08 09:38:58
你的代码:
let customerID = json["CustomerID"] as? [[String: Any]] {
print(customerID)
}将customerID视为字典而不是字符串。
它应该是:
let customerID = json["CustomerID"] as? String {
print(customerID)
}您应该使用另一种网络请求和JSON解析器的方式,比如阿拉莫火与AlamofireObjectMapper。
https://stackoverflow.com/questions/44431683
复制相似问题