Я пришел с этим к кирпичной стене. Кто-нибудь может помочь? У меня есть веб-служба, для которой требуется параметр FilteredString, который необходимо передать веб-службе GetProjectRegisterFiltered. Я пробовал несколько вариантов, но все равно не получил результатов. Веб-сервис идентичен другому, который работает, я только что добавил к нему параметр.
func GetFilteredRecords(){
let is_SoapMessage: String = "<?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></soap:Body></soap:Envelope>"
let URL: String = "http://192.168.1.208:8080/Service.asmx"
let WebRequ = NSMutableURLRequest(url: NSURL(string: URL)! as URL)
WebRequ.httpMethod = "POST"
WebRequ.httpBody = is_SoapMessage.data(using: String.Encoding.utf8)
WebRequ.addValue("text/xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
WebRequ.addValue(String(is_SoapMessage), forHTTPHeaderField: "Content-Length")
WebRequ.addValue("myServices/GetProjectRegisterFiltered", forHTTPHeaderField: "SOAPAction")
var Str: String = ""
let task = session.dataTask(with: WebRequ as URLRequest, completionHandler: {data, response, error -> Void in
let strData = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
Str = String(strData!) as String
print(strData!)
Str = Str.replacingOccurrences(of: "<", with: "<")
Str = Str.replacingOccurrences(of: ">", with: ">")
Str = Str.replacingOccurrences(of: "&", with: "&")
let data2 = Data(Str.utf8)
self.ReadPRData(Data: data2)
if error != nil
{
print("Error: " + error.debugDescription)
}
})
task.resume()
}
WebRequ.addValue(String(is_SoapMessage), forHTTPHeaderField: "Content-Length") странный. Разве is_SoapMessage уже не является строкой? Вы имели в виду String(is_SoapMessage.data(using: String.Encoding.utf8))? Кроме того, действительно ли GetProjectRegisterFiltered нужно помещать в заголовок, или он должен быть в is_SoapMessage, отправлять через httpBody?
Я новичок в Swift, и я много раз экспериментировал с кодом и пробовал множество вариаций, которые я забыл, где я задумал. Избегайте NSStuff - это долгожданный совет. Я заметил, что Swift довольно часто на это жалуется. Я думал, что все, что мне нужно сделать, это добавить одну строку вроде WebRequ.addValue ("My Param", forHTTPHeaderField: "FilteredString"), но не тут-то было :(
Кроме того, веб-службы WSDL были созданы на компьютере под управлением Windows с использованием VB.NET и Visual Studio. Не уверен, что это имеет значение. Я много лет использовал веб-службы, используя VB.NET и C# без проблем, но теперь я балуюсь Swift, это большая кривая обучения :)
Совет, поскольку кажется, что вы экспериментируете с другими языками в этой области. Вы можете попытаться воспроизвести свой запрос в POSTMAN, и он может сгенерировать код Swift, который может вдохновить вас на то, где разместить элементы (заголовок, тело и т. д.). Это не всегда очень красивый код, но чтобы знать, нужно ли нам помещать это в заголовке, URL-адресе или теле довольно интересно.





Забыла поблагодарить всех за ответы. У меня не было полного понимания того, как работают запросы SOAP. Но теперь я верю. Я не знал, что мне просто нужно было добавить переменные в строку запроса SOAP следующим образом:
is_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><GetDiaryByDay xmlns=\"MyWebWebsite\"><Username>\(Username)</Username><Password>\(Password)</Password><Day>\(Day)</Day><Month>\(Month)</Month><Year>\(Year)</Year></GetDiaryByDay></soap:Body></soap:Envelope>"
Не связано: Избегайте
NSStuff, если он доступен:NSMutableURLRequest=>URLRequest,NSURL=>URL, в этом случае вам следует избегатьas URLRequestи т. д. Избегайте именования переменных, начиная с верхнего регистра, и назовите их полностью:let WebRequ=>let webRequestилиlet request. Ваш метод тоже:ReadPRData(Data: data2)readPRData(data: data2)(может захотеть убрать двойные "данные"). Наконец, вы должны использовать здесь[weak self]для устранения проблемы с утечкой памяти.