带有Alamofire的Swift 2.0 soap请求发送xml参数

时间:2015-10-31 02:05:05

标签: xml swift soap alamofire

我想对此Web服务示例发出请求:http://www.holidaywebservice.com//HolidayService_v2/HolidayService2.asmx?wsdl

我需要发送一个参数" countryCode"。我不知道如何用alamofire做到这一点。以及如何获得解析xml结果的响应。

这就是我在邮递员中的表现,但我想知道如何在快递中做同样的事情。 enter image description here

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

试试吧

  • 将发出POST请求
  • 网址= http://holidaywebservice.com/HolidayService_v2/HolidayService2.asmx?wsdl
  • 参数将发送到编码部分
  • 编码:.Custom =>
  • 创建了mutbleRequest
  • 一个。您可以直接使用URL或b。新网址
  • 重要的是mutableRequest.HTTBody,它是使用必要值放置soap-message的地方(类型为String)
  • Headers可能因Web服务和API而异,在一种情况下可以有登录/密码/令牌或仅授权

  • 该行 - > “Content-Type”:或“Content-Length”取决于具体情况。

  • SWXMLHash.parse(response.data!)是处理响应的,您可以在[AlamoFire / Usage / Response Handling](https://github.com/Alamofire/Alamofire)中看到更多信息

       Alamofire.request(.POST, "http://holidaywebservice.com/HolidayService_v2/HolidayService2.asmx?wsdl", 
    parameters: nil, 
    encoding: .Custom({
       (convertible, params) in
           //a.
           let mutableRequest = convertible.URLRequest.copy() as!                NSMutableURLRequest
           // or 
           //b.
           mutableRequest.URL =NSURL(string: theUrlString)
           let mutableReques02 = NSMutableURLRequest(URL: theURL!)
           //
           //mutableReques02.HTTPBody =....
    
           mutableRequest.HTTPBody =       
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
                <SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ns1=\"urn:sap-com:document:sap:rfc:functions\"><SOAP-ENV:Body>
                  <hs:GetHolidaysAvaible>
                  <hs:countrycode> UnitedStates</hs:countrycode>
                  </hs:GetHolidaysAvaible>
                 </SOAP-ENV:Body></SOAP-ENV:Envelope>".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
    
        return (mutableRequest, nil)}),
     headers: 
        ["Username": "login", // Login API
         "Password": "password" , // Password API
         "AuthenticatedToken" : "35432",  // Authenticated API
         "Authorization": "Basic nasiouynvo8eyt829409", // Authenticated API
        "Accept" :       "text/xml", 
        "Content-Type" : "text/xml; charset=UTF-8", // Type content and charset accept 
        "Accept-Charset" : "UTF-8",])
     .responsePropertyList { response in 
           let xml = SWXMLHash.parse(response.data!)
                    print(xml) 
    }
    

注意:我的英语不是很好

答案 1 :(得分:2)

我编写了一个用于将XML映射到对象的窗格,称为XMLMapper。 (使用与ObjectMapper相同的技术)

您可以使用Requests subspec轻松创建SOAP请求。

首先创建自己的自定义SOAPMessage

class HolidayServiceMessage: SOAPMessage {

    var countryCode: String?

    override func mapping(map: XMLMap) {
        super.mapping(map: map)

        countryCode <- map["m:countrycode"]
    }
}

然后创建SOAPEnvelope,如:

let soapMessage = HolidayServiceMessage(soapAction: "GetHolidaysAvaible", nameSpace: "http://holidaywebservice.com/HolidayService_v2")
soapMessage.countryCode = "UnitedStates"

let soapEnvelope = SOAPEnvelope(soapMessage: soapMessage)

最终使用Alamofire发送SOAP请求:

Alamofire.request("http://holidaywebservice.com/HolidayService_v2/HolidayService2.asmx?wsdl", method: .post, parameters: soapEnvelope.toXML(), encoding: XMLEncoding.soap(withAction: "http://holidaywebservice.com/HolidayService_v2#GetHolidaysAvaible"))

您可以使用XMLMappable协议将XML响应映射到swift对象。

答案 2 :(得分:0)

我是从github得到的:

  

Alamofire没有任何内置的SOAP或XML支持,所以你有   写你自己的。幸运的是,创建自定义很简单   响应序列化程序,但XML解析由您决定。

     

至于参数,请查看文档并查看哪些   内置编码与您的用例匹配。

答案 3 :(得分:-3)

看看SOAPEngine.它支持Swift,似乎维护得很好。