【问题标题】:Swift - Passing a parameter to a web serviceSwift - 将参数传递给 Web 服务
【发布时间】:2019-05-19 03:16:25
【问题描述】:

我遇到了这个问题。有人可以帮忙吗?我有一个 Web 服务,它需要一个名为 FilteredString 的参数,该参数必须传递给一个名为 GetProjectRegisterFiltered 的 Web 服务。我已经尝试了许多变化,但我仍然没有得到任何结果。该网络服务与另一个有效的网络服务相同,我只是为其添加了一个参数。

    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: "&lt;", with: "<")
        Str = Str.replacingOccurrences(of: "&gt;", with: ">")
        Str = Str.replacingOccurrences(of: "&amp;", with: "&")
        let data2 = Data(Str.utf8)
        self.ReadPRData(Data: data2)

        if error != nil
        {
            print("Error: " + error.debugDescription)
        }
    })
    task.resume()
}

【问题讨论】:

  • 不相关:避免 NSStuff 可用时:NSMutableURLRequest => URLRequestNSURL => URL,那应该避免使用 as URLRequest 等。避免命名您的以大写字母开头的变量,并完整命名它们:let WebRequ => let webRequestlet request。你的方法也是:ReadPRData(Data: data2)readPRData(data: data2)(可能想删除双“数据”)。最后,您应该在此处使用[weak self] 来解决内存泄漏问题。
  • 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 Web 服务是使用 VB.NET 和 Visual Studio 在 Windows 机器上创建的。不确定这是否重要。我已经使用 VB.NET 和 C# 使用 Web 服务多年,没有任何问题,但现在我正在涉足 Swift,这是一个很大的学习曲线 :)
  • 一个提示,因为您似乎在该领域的其他语言中进行过实验。您可以尝试在 POSTMAN 中重现您的请求,它可以生成 Swift 代码,可以启发您放置元素(标题、正文等)的位置。这并不总是很好看的代码,但要知道我们是否需要放置它在 header、url 或 body 中很有趣。

标签: swift web-services web soap


【解决方案1】:

我忘了感谢大家的回复。我没有完全理解 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>"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-25
    • 1970-01-01
    • 2011-07-31
    • 2015-08-10
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多