İPhone'dan SOAP servislerine nasıl erişilir


224

İPhone için bir uygulama geliştirmeyi planlıyorum ve bu uygulama birkaç SOAP servisine erişmek zorunda kalacak. İPhone SDK'da bazı temel kontroller yaparken, SOAP servislerine erişim için herhangi bir destek bulamadım, biraz Googling, iPhone SDK'da SOAP için destek olmadığı sonucuna yol açtı.

Bu uygulamayı oluşturmak istersem, iPhone'dan SOAP servislerine erişmek için bir yaklaşım bulmam gerekecek. En iyi yaklaşım ne olurdu? En iyi uygulamalarınız var mı? Birisi SOAP servislerine erişmek için iPhone SDK'sında bulunan işlevselliği kullanarak bir kütüphane zaten yazmış mı?

(Erişmem gereken hizmet başka bir tarafça maruz kaldığından ve yalnızca SOAP olarak gösterdiklerinden, maalesef başka bir arayüz türüne (örneğin REST tabanlı API) geçiş yapmak için bir seçenek değil.

Gero


9
Merhaba Gero, ne sabun hizmeti ur uygulama için kullandınız. u herhangi bir cevap doğru bahsetmedim gibi.
Ameya

3
Hizmeti kullandıktan sonra, ileride başkaları için referans olması için lütfen eğitimleri gönderin.
Vineesh TP

Yanıtlar:


52

Tek kelime: Yapma.

Tamam açıkçası bu gerçek bir cevap değil. Ancak yine de SOAP'tan ne pahasına olursa olsun kaçınılmalıdır. ;-) iPhone ile web servisi arasına bir proxy sunucusu eklemek mümkün müdür? Belki de REST'i sizin için SABUN'a dönüştüren bir şey?

Sen olabilir denemek CSOAP , (iPhone SDK dahildir) libxml2'nin bağlı olan bir SOAP kütüphanesi.

OSX için kendi SOAP çerçevemi yazdım . Ancak aktif olarak korunmaz ve iPhone'a bağlantı noktasına biraz zaman gerektirecektir (Birlikte NSXML değiştirmeniz gerekir TouchXML bir başlangıç için)


11
"Ama yine de SOAP her ne pahasına olursa olsun kaçınılmalıdır"
girebilir miyim

9
Sadece sabunun mutlaka uygun olmaması, uygulamasında doğru olmadığı anlamına gelmez, en iyi pratikin ötesine geçmekten daha sık ihtiyaç duyulan ihtiyaçlar vardır
Anthony Main

11
@schwa - Kesinlikle hiçbir destekleyici kanıt ya da savunma olmaksızın potansiyel olarak yararlı bir cevap göndermekten dolayı oy kullanıldı.
DougW

12
Bu "Varsayılan olarak sağlanmadığı için kullanmayın" teknik eşdeğeridir - SOAP veya bir hizmet tarafından sağlanan diğer mekanizmaları kullanmamanız için gerçek bir teknik neden yoktur.
Petesh

9
İşte en azından bir cevap - SOAP, REST'e kıyasla çok yüksek bir genel protokoldür. Tüm ad alanı ve geçerlilik denetimi ve benzeri mesajınıza bir ton ekstra karakter ekler ve bu 3G gibi yüksek gecikmeli, potansiyel olarak yavaş bir ağ üzerinden kaçınmak istediğiniz şeydir. Uygulamanızın yalnızca mükemmel sinyalli 4 g'lık bir ortamda veya yalnızca Kablosuz'da kullanılacağını garanti ederseniz, daha uygun olabilir. Ancak genel olarak mobil ağ ile daha azı daha fazladır.
Vineel Shah

7

Benim çözümüm, bir proxy sunucusunun REST'i kabul etmesini, SOAP isteğini yayınlamasını ve PHP kullanarak sonuç döndürmesini sağlamaktı.

Uygulama süresi: 15-30 dakika.

En zarif değil, sağlam.


4
Bunu nasıl yaptın? herhangi bir belge. tnx
İlkbahar

3
Gizemli cevapsızlığı seviyorum. bu nasıl onaylandı?
gdbj

@gdbj çünkü REST ve SOAP arasında 1: 1 dönüşüm kendiliğinden anlaşılır olmalıdır ...
Sihirli Ahtapot Urn

1
Bu Nedir, ama Nasıl sorusuna cevap vermiyor, bu yüzden insanlar buraya geliyor. Uygulamanın burada ne olacağına dair cevabı hala merak ediyorum, özellikle de bu kadar basitse.
gdbj

4

Tarihsel olarak zaman zaman Objective-C SOAP tarzı istekleri yapmak ihtiyacı ile başa çıkmak için düşük düzeyde (XML oluşturma ve ayrıştırma) kendi rulo yuvarladım. Bununla birlikte, açık kaynak (BSD lisanslı) olan ve ilgi çekici olabilecek Google Code'da ( mac-soapclient ) bulunan SOAPClient ( soapclient ) adı verilen bir kütüphane var .

Daha önce hiç kullanmadığım veya API'larıyla çalışmak zorunda kaldığım için yeteneklerini veya etkinliğini kanıtlamayacağım, ancak kullanılabilir ve ihtiyaçlarınıza bağlı olarak sizin için hızlı bir çözüm sağlayabilir.

Apple, bir zamanlar WS-MakeStubs adlı çok bozuk bir yardımcı programa sahipti. Ben iPhone kullanılabilir olduğunu düşünmüyorum, ama aynı zamanda bunun yerine amaçlanan bir açık kaynak kitaplığı ilginizi çekebilir - kod bir SOAP istemcisi ile etkileşim için Objective-C oluşturmak. Yine, ben kullanmadım - ama notlarımda işaretledim: wsdl2objc


Teşekkürler, wsdl2objc kullanmaya çalıştım. WSDL'den ObjectiveC kodu oluşturulması çalışır, ancak (beklendiği gibi) doğrudan iPhone SDK'ya karşı derlenmez. Kaynakları biraz düzeltmeye çalıştım, ama çözemediğim bir sürü hata ile sona erdi
Gero

2

Bulduğum bir aracı kullanarak bağlanabilirsiniz 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

İşte olan hızlı 4 API SOAP hizmeti biçimini kullanarak arayarak yürütmek örnek kod.

   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

Bu bağlantıya ve yol haritalarına bir göz atın . Yolda RO | C var ve muhtemelen SOAP içeren web hizmetlerine bağlanabiliyor (kesinlikle içeren VCL sürümünü kullanıyorum).


0

İos_plugin altındaki indirme paketinde iki iOS örneği içeren gsoap'a göz atın . Araç, WSDL'yi SOAP ve XML REST koduna dönüştürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.