【问题标题】:Swift 2.0 soap request with Alamofire send xml parameters带有 Alamofire 的 Swift 2.0 肥皂请求发送 xml 参数
【发布时间】:2016-01-31 13:10:27
【问题描述】:

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

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

这就是我在邮递员中所做的,但我想知道如何在 swift 中做同样的事情。

感谢您的帮助。

【问题讨论】:

标签: xml swift soap alamofire


【解决方案1】:

试试看

  • 将发出 POST 请求
  • 网址 = http://holidaywebservice.com/HolidayService_v2/HolidayService2.asmx?wsdl
  • 参数被发送到编码部分
  • 编码:.Custom =>
  • 创建了一个 mutbleRequest
  • 一个。您可以直接获取 URL 或 b。新网址
  • 重要的是 mutableRequest.HTTBody,它是放置带有必要值(字符串类型)的肥皂消息的位置
  • 标头可能因 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) 
    }
    

注意:我的英文不是很好

【讨论】:

  • 如果您在答案中添加代码说明会有所帮助
  • 现在检查,我试试解释
【解决方案2】:

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

您可以使用Requests 子规范轻松创建 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 对象。

【讨论】:

    【解决方案3】:

    我从 github 得到这个:

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

    至于参数,看看文档,看看哪个 的内置编码匹配您的用例。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2014-11-20
      相关资源
      最近更新 更多