ChatGPT解决这个技术问题 Extra ChatGPT

如何从 iPhone 访问 SOAP 服务

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

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

(由于我需要访问的服务由另一方公开,并且他们只将其公开为 SOAP,不幸的是,它不是切换到另一种类型的接口(例如基于 REST 的 API)的选项。

下吕

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

s
schwa

一个字:不要。

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

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

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


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

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

实施时间:15-30分钟。

不是最优雅,但坚固。


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

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

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

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


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

您可以使用我找到的工具进行连接 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];

S
Sunil M.

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

   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()
    }

r
rptwsthi

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


D
Dr. Alex RE

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