如何从iPhone访问SOAP服务


224

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

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

(由于我需要访问的服务是由另一方公开的,并且它们仅将其公开为SOAP,因此遗憾的是,不能选择切换到另一种类型的接口(例如,基于REST的API)。

下吕


9
嗨,Gero,您在您的应用程序中使用了哪些肥皂服务。因为您还没有提到任何正确的答案。
阿美亚

3
使用该服务后,请发布教程以供其他参考。
Vineesh TP

Answers:


52

一句话:不要。

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

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

我已经为OSX 编写了自己的SOAP框架。但是,它并未得到积极维护,需要一些时间才能移植到iPhone(开始时需要将NSXML替换为TouchXML


11
您能详细说明一下“但仍应不惜一切代价避免使用SOAP”的
说法

9
仅仅因为肥皂不一定合适就可以,这并不意味着肥皂在其实施中是不正确的,有很多需要超越最佳实践的需求
Anthony Main

11
@schwa-因绝对没有支持证据或辩护而发布可能有用的答案而被否决。
DougW

12
这在技术上等同于“不要使用它,因为默认情况下不提供它”-没有真正的技术原因,您不应该使用SOAP或服务提供的任何其他机制。
Petesh 2010年

9
这至少是一个答案-与REST相比,SOAP是一种开销很大的协议。所有的命名空间和有效性检查等都会在您的消息中添加大量额外的字符,而这恰恰是您希望避免在高延迟,可能很慢的网络(例如3G)上使用的字符。如果可以保证您的应用仅在信号良好的4g环境中使用,或者仅在Wifi中使用,则可能更合适。但通常在移动网络中,少即是多。
Vineel Shah 2012年

7

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

实施时间:15-30分钟。

不是最优雅,但坚固。


4
你怎么了 任何文件。tnx
春天

3
我喜欢神秘的非答案。意见如何?
gdbj

@gdbj,因为REST和SOAP之间的1:1转换应该是不言自明的……
Magic Octopus Urn

1
那就是“什么”,但是没有回答“如何”的问题,这就是为什么人们来这里的原因。我仍然对这里实现的答案感到好奇,特别是如果它是如此简单。
gdbj

4

历史上,我将自己的访问权限降低了(XML生成和解析),以处理偶尔需要从Objective-C进行SOAP样式请求的需求。就是说,有一个可能叫做SOAPClient(soapclient)的库是开源的(已获得BSD许可),并且可以在Google Code(mac-soapclient)上找到它。

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

苹果曾经有一个非常破烂的工具,叫做WS-MakeStubs。我认为它在iPhone上不可用,但您可能还对打算替换该开源库的开源库感兴趣-代码生成了Objective-C以与SOAP客户端进行交互。再一次,我没有使用过-但是我在笔记中将其标记为:wsdl2objc


谢谢,我尝试使用wsdl2objc。可以从WSDL生成ObjectiveC代码,但是(不出所料)不能直接针对iPhone SDK进行编译。我尝试了一些调整,但最终出现了一些我无法解决的错误
Gero

2

您可以使用我发现的工具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];

2

这是一个快速的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()
    }

0

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.