Cara mengakses layanan SOAP dari iPhone

224

Saya berencana untuk mengembangkan aplikasi untuk iPhone dan aplikasi itu harus mengakses beberapa layanan SOAP. Saat melakukan pengecekan dasar pada iPhone SDK saya tidak dapat menemukan dukungan untuk mengakses layanan SOAP, sedikit Googling mengarah pada kesimpulan bahwa tidak ada dukungan untuk SOAP di iPhone SDK.

Jadi jika saya ingin membangun aplikasi itu, saya harus membuat pendekatan untuk mengakses layanan SOAP dari iPhone. Apa yang akan menjadi pendekatan terbaik? Adakah praktik terbaik? Apakah seseorang sudah menulis perpustakaan menggunakan fungsionalitas yang ada di iPhone SDK untuk mengakses layanan SOAP?

(Karena layanan yang saya butuhkan untuk mengakses diekspos oleh pihak lain dan mereka hanya mengeksposnya sebagai SOAP, sayangnya itu bukan pilihan untuk beralih ke jenis antarmuka lain (misalnya API berbasis REST).

Gero

Gero
sumber
9
Hai Gero, Layanan sabun apa yang Anda gunakan untuk aplikasi Anda. karena kamu belum menyebutkan jawaban yang benar.
Ameya
3
Setelah Anda menggunakan layanan ini, silakan posting tutorial untuk referensi di masa depan untuk Orang Lain.
Vineesh TP

Jawaban:

52

Satu kata: Jangan.

OK jelas itu bukan jawaban yang nyata. Tapi tetap saja SOAP harus dihindari dengan cara apa pun. ;-) Apakah mungkin untuk menambahkan server proxy antara iPhone dan layanan web? Mungkin sesuatu yang mengubah REST menjadi sabun untuk Anda?

Anda bisa mencoba CSOAP , pustaka SOAP yang bergantung pada libxml2 (yang termasuk dalam iPhone SDK).

Saya telah menulis kerangka SOAP saya sendiri untuk OSX. Namun itu tidak dipelihara secara aktif dan akan membutuhkan waktu untuk port ke iPhone (Anda harus mengganti NSXML dengan TouchXML sebagai permulaan)

schwa
sumber
11
Bisakah Anda menguraikan pernyataan ini "Tapi tetap SOAP harus dihindari di semua biaya"
WillF
9
Hanya karena sabun belum tentu sesuai bukan berarti itu tidak benar dalam implementasinya, ada kebutuhan yang melampaui praktik terbaik lebih sering daripada tidak
Anthony Main
11
@schwa - Diturunkan karena memposting jawaban yang berpotensi berguna tanpa benar-benar bukti atau pertahanan.
DougW
12
Ini setara dengan teknis "Jangan gunakan karena tidak disediakan secara default" - Tidak ada alasan teknis nyata mengapa Anda tidak boleh menggunakan SOAP atau mekanisme lain yang disediakan oleh layanan.
Petesh
9
Setidaknya ada satu jawaban - SOAP adalah protokol overhead yang sangat tinggi dibandingkan dengan REST. Semua penamaan ruang dan pengecekan validitas dan semacamnya menambahkan satu ton karakter tambahan ke pesan Anda, dan inilah yang ingin Anda hindari dari latensi tinggi, jaringan yang berpotensi lambat, seperti 3G. Jika Anda dapat menjamin bahwa aplikasi Anda hanya akan digunakan di lingkungan 4g dengan sinyal yang sangat baik, atau hanya di Wifi, itu mungkin lebih tepat. Tetapi secara umum dengan jaringan seluler, lebih sedikit lebih banyak.
Vineel Shah
7

Solusi saya adalah membuat server proxy menerima REST, mengeluarkan permintaan SOAP, dan mengembalikan hasilnya, menggunakan PHP.

Waktu untuk mengimplementasikan: 15-30 menit.

Bukan yang paling elegan, tapi solid.

davidjhinson
sumber
4
Bagaimana Anda melakukannya? dokumen apa pun. tnx
Musim Semi
3
Saya suka jawaban misterius. bagaimana ini dibalik?
gdbj
@ gdbj karena konversi 1: 1 antara REST dan SOAP harus jelas ...
Magic Gurita Guci
1
Itulah Yang, tetapi tidak menjawab pertanyaan tentang Bagaimana, itulah sebabnya orang-orang datang ke sini. Saya masih penasaran dengan jawaban tentang apa implementasinya di sini, terutama jika itu sangat sederhana.
gdbj
4

Secara historis saya telah menggulung akses saya sendiri pada level rendah (pembuatan XML dan parsing) untuk menangani kebutuhan sesekali untuk melakukan permintaan gaya SOAP dari Objective-C. Yang mengatakan, ada perpustakaan tersedia yang disebut SOAPClient ( soapclient ) yang bersifat open source (BSD berlisensi) dan tersedia di Google Code ( mac-soapclient ) yang mungkin menarik.

Saya tidak akan membuktikan kemampuan atau efektivitasnya, karena saya belum pernah menggunakannya atau harus bekerja dengan API-nya, tetapi API itu tersedia dan mungkin memberikan solusi cepat untuk Anda tergantung pada kebutuhan Anda.

Apple pernah, pada suatu waktu, utilitas yang sangat rusak yang disebut WS-MakeStubs. Saya tidak berpikir itu tersedia di iPhone, tetapi Anda mungkin juga tertarik pada perpustakaan open-source yang dimaksudkan untuk menggantikannya - kode menghasilkan Objective-C untuk berinteraksi dengan klien SOAP. Sekali lagi, saya belum menggunakannya - tetapi saya telah menandainya di catatan saya: wsdl2objc

heckj
sumber
Terima kasih, saya mencoba menggunakan wsdl2objc. Pembuatan kode ObjectiveC dari WSDL berfungsi, tetapi (seperti yang diharapkan) tidak secara langsung dikompilasi dengan iPhone SDK. Saya mencoba untuk men-tweak sumber sedikit, tetapi berakhir dengan banyak kesalahan yang tidak bisa saya selesaikan
Gero
2

Anda dapat terhubung menggunakan alat yang saya temukan 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];
Bennya
sumber
2

Berikut ini adalah 4 contoh kode cepat yang mengeksekusi panggilan API menggunakan format layanan SOAP.

   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()
    }
Tech
sumber
0

Lihat di sini tautan ini dan peta jalannya. Mereka memiliki RO | C di jalan, dan yang dapat terhubung ke layanan web mereka, yang mungkin termasuk SOAP (saya menggunakan versi VCL yang pasti menyertakannya).

mj2008
sumber
0

Lihat gsoap yang menyertakan dua contoh iOS dalam paket unduhan di bawah ios_plugin. Alat ini mengkonversi WSDL ke kode untuk SOAP dan XML REST.

Alex RE
sumber