【问题标题】:How to access SOAP services from iPhone如何从 iPhone 访问 SOAP 服务
【发布时间】:2010-09-17 07:06:19
【问题描述】:

我正计划为 iPhone 开发一个应用程序,该应用程序必须访问几个 SOAP 服务。在对 iPhone SDK 进行一些基本检查时,我找不到任何对访问 SOAP 服务的支持,通过谷歌搜索得出的结论是 iPhone SDK 中不支持 SOAP。

因此,如果我确实想构建那个应用程序,我需要想出一种方法来从 iPhone 访问 SOAP 服务。最好的方法是什么?有什么最佳实践吗?是否有人已经使用 iPhone SDK 中的功能编写了一个库来访问 SOAP 服务?

(由于我需要访问的服务已被另一方公开,并且他们仅将其公开为 SOAP,因此很遗憾,无法切换到其他类型的接口(例如基于 REST 的 API)。

格罗

【问题讨论】:

  • 嗨,Gero,您在申请中使用了什么肥皂服务。因为你没有提到任何正确的答案。
  • 在您使用服务后,请将教程贴出来以供他人参考。

标签: iphone ios web-services soap wsdl


【解决方案1】:

一个字:不要。

好吧,显然这不是一个真正的答案。但仍应不惜一切代价避免使用 SOAP。 ;-) 是否可以在 iPhone 和网络服务之间添加代理服务器?也许可以为您将 REST 转换为 SOAP?

可以尝试CSOAP,这是一个依赖于 libxml2(包含在 iPhone SDK 中)的 SOAP 库。

我已经为 OSX 编写了自己的 SOAP framework。但是它没有得到积极维护,需要一些时间才能移植到 iPhone(首先需要将 NSXML 替换为 TouchXML

【讨论】:

  • 您能否详细说明“但仍应不惜一切代价避免使用 SOAP”这一说法
  • 只是因为肥皂不一定合适并不意味着它在他的实施中不正确,有些需求往往超出最佳实践
  • @schwa - 在完全没有支持证据或辩护的情况下发布可能有用的答案而被否决。
  • 这是“不要使用它,因为默认情况下不提供它”的技术等价物 - 没有真正的技术原因不应该使用 SOAP 或服务提供的任何其他机制.
  • 这里至少有一个答案——与 REST 相比,SOAP 是一个开销非常大的协议。所有的命名空间和有效性检查等都会为您的消息添加大量额外字符,而这正是您希望在高延迟、可能较慢的网络(例如 3G)上避免的。如果你能保证你的应用只在信号良好的4g环境下使用,或者只在Wifi环境下使用,那可能更合适。但总的来说,对于移动网络,少即是多。
【解决方案2】:

我的解决方案是使用 PHP 让代理服务器接受 REST、发出 SOAP 请求并返回结果。

实施时间:15-30 分钟。

不是最优雅,但很扎实。

【讨论】:

  • 你是怎么做到的?任何文件。 tnx
  • 我喜欢神秘的无答案。这是怎么被赞成的?
  • @gdbj 因为 REST 和 SOAP 之间的 1:1 转换应该是不言自明的......
  • 这就是什么,但没有回答“如何”的问题,这就是人们来这里的原因。我仍然对这里的实现方式感到好奇,特别是如果它如此简单的话。
【解决方案3】:

我一直在低级别(XML 生成和解析)上滚动自己的访问,以处理偶尔需要从 Objective-C 执行 SOAP 样式请求。也就是说,有一个名为 SOAPClient (soapclient) 的库可用,它是开源的(BSD 许可)并可在可能感兴趣的 Google 代码 (mac-soapclient) 上找到。

我不会证明它的能力或有效性,因为我从未使用过它或不得不使用它的 API,但它是可用的,并且可能会根据您的需要为您提供快速解决方案。

Apple 曾经有一个非常糟糕的实用程序,称为 WS-MakeStubs。我认为它在 iPhone 上不可用,但您可能还对旨在替换它的开源库感兴趣 - 代码生成 Objective-C 用于与 SOAP 客户端交互。同样,我没有使用它 - 但我已经在我的笔记中标记了它:wsdl2objc

【讨论】:

  • 谢谢,我尝试使用 wsdl2objc。从 WSDL 生成 ObjectiveC 代码是可行的,但(如预期的那样)不直接针对 iPhone SDK 进行编译。我尝试稍微调整一下来源,但最终出现了一堆我无法解决的错误
【解决方案4】:

您可以使用我找到的工具进行连接http://www.wsdl2code.com

SampleServiceProxy *proxy = [[SampleServiceProxy alloc]initWithUrl:@"YOUR
        URL" AndDelegate:self];

[proxy GetDouble];
[proxy GetEnum];
[proxy getEnum:kTestEnumTestEnum2];
[proxy GetInt16];
[proxy GetInt32];
[proxy GetInt64];
[proxy GetString];
[proxy getListStrings];

【讨论】:

    【解决方案5】:

    这是一个 swift 4 示例代码,它使用 SOAP 服务格式执行 API 调用。

       func callSOAPWSToGetData() {
    
            let strSOAPMessage =
                "<?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>" +
                    "<CelsiusToFahrenheit xmlns=\"http://www.yourapi.com/webservices/\">" +
                    "<Celsius>50</Celsius>" +
                    "</CelsiusToFahrenheit>" +
                    "</soap:Body>" +
            "</soap:Envelope>"
    
            guard let url = URL.init(string: "http://www.example.org") else {
                return
            }
            var request = URLRequest.init(url: url)
            let length = (strSOAPMessage as NSString).length
            request.addValue("application/soap+xml; charset=utf-8", forHTTPHeaderField: "Content-Type")
            request.addValue("http://www.yourapi.com/webservices/CelsiusToFahrenheit", forHTTPHeaderField: "SOAPAction")
            request.addValue(String(length), forHTTPHeaderField: "Content-Length")
            request.httpMethod = "POST"
            request.httpBody = strSOAPMessage.data(using: .utf8)
    
            let config = URLSessionConfiguration.default
            let session = URLSession(configuration: config)
            let task = session.dataTask(with: request) { (data, response, error) in
                guard let responseData = data else {
                    print("Error: did not receive data")
                    return
                }
                guard error == nil else {
                    print("error calling GET on /todos/1")
                    print(error ?? "")
                    return
                }
                print(responseData)
                let strData = String.init(data: responseData, encoding: .utf8)
                print(strData ?? "")
            }
            task.resume()
        }
    

    【讨论】:

      【解决方案6】:

      查看here this link 及其路线图。他们正在开发 RO|C,并且可以连接到他们的 Web 服务,其中可能包括 SOAP(我使用肯定包含它的 VCL 版本)。

      【讨论】:

        【解决方案7】:

        查看gsoap,它在 ios_plugin 下的下载包中包含两个 iOS 示例。该工具将 WSDL 转换为 SOAP 和 XML REST 的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-10-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          相关资源
          最近更新 更多