Як отримати доступ до послуг SOAP з iPhone


224

Я планую розробити додаток для iPhone, і цей додаток повинен мати доступ до пари служб SOAP. Здійснюючи основні перевірки в iPhone SDK, я не зміг знайти жодної підтримки для доступу до служб SOAP. Трохи Googling приводить до висновку, що в iPhone SDK немає підтримки для SOAP.

Тож якщо я хочу створити цю програму, мені потрібно придумати підхід до послуг SOAP з iPhone. Який був би найкращий підхід? Якісь найкращі практики? Хтось уже написав бібліотеку, використовуючи функціонал, наявний в iPhone SDK для доступу до послуг SOAP?

(Оскільки послугу, до якої мені потрібно отримати доступ, піддається інша сторона, і вони виставляють її лише як SOAP, на жаль, це не можливість переключитися на інший тип інтерфейсу (наприклад, API на основі REST).

Геро


9
Привіт Геро, яку мильну службу ви використовували для застосування ур. як ви не вказали відповіді правильними.
— Амея

3
Після використання послуги, будь ласка, розмістіть підручники для подальшого ознайомлення з іншими.
— Vineesh TP

Відповіді:


52

Одне слово: Не.

ОК, очевидно, це не справжня відповідь. Але все-таки SOAP варто уникати будь-якою ціною. ;-) Чи можна додати проксі-сервер між iPhone та веб-сервісом? Можливо, щось, що перетворює REST в SOAP для вас?

Ви можете спробувати CSOAP , бібліотеку SOAP, яка залежить від libxml2 (яка входить до iPhone SDK).

Я написав власну структуру SOAP для OSX. Однак він не підтримується активно і потребує певного часу для порту на iPhone (для початку вам потрібно буде замінити NSXML на TouchXML )


11
Чи можете ви детальніше зупинитися на цьому твердженні "Але все-таки SOAP слід уникати будь-якою ціною"
— WillF

9
Тільки причина мила не обов'язково підходить, не означає, що це не правильно в його здійсненні, є потреби, які частіше за все виходять за рамки найкращих мотивів
— Ентоні Майн

11
@schwa - Захищений для розміщення потенційно корисної відповіді без абсолютно жодних підтверджень чи захисту.
— DougW

12
Це технічний еквівалент "Не використовувати його, оскільки він не надається за замовчуванням". Немає реальної технічної причини, чому ви не повинні використовувати SOAP або будь-який інший механізм, який надається послугою.
— Петеш

9
Ось принаймні відповідь - SOAP - це дуже високий накладний протокол порівняно з REST. Усі перевірки простору імен та дійсності додають у ваше повідомлення тону зайвих символів, і саме цього ви хочете уникати через велику затримку потенційно повільної мережі, наприклад 3G. Якщо ви можете гарантувати, що ваш додаток буде використовуватися лише в 4g-середовищі з відмінним сигналом або лише в Wi-Fi, це може бути більш доцільним. Але загалом із мобільними мережами менше менше.
— Vineel Shah

7

Моє рішення полягало в тому, щоб проксі-сервер прийняв REST, видав запит SOAP і повернув результат, використовуючи PHP.

Час на виконання: 15-30 хвилин.

Не найвишуканіший, але солідний.


4
Як ти це зробив? будь-які документи. tnx
— Весна

3
Я люблю таємничий невідповідь. як це було схвалено?
— gdbj

@gdbj, тому що перетворення 1: 1 між REST та SOAP повинно бути зрозумілим ...
— Чарівний восьминога Урна

1
Це Що, але не відповідає на питання як, через що люди приходять сюди. Мені все ще цікаво відповідь про те, якою була б реалізація тут, особливо якщо це так просто.
— gdbj

4

Я історично прокручував власний доступ на низькому рівні (генерація XML та аналіз), щоб вирішити випадкові потреби робити запити у стилі SOAP від ​​Objective-C. З цього приводу існує бібліотека під назвою SOAPClient ( soapclient ), яка є відкритим кодом (BSD з ліцензією) та доступною в Google Code ( mac-soapclient ), яка може представляти інтерес.

Я не буду засвідчувати його здібності або ефективність, так як я ніколи не використовував його або працював з його API, але він доступний і може забезпечити швидке рішення для вас залежно від ваших потреб.

Свого часу Apple мала дуже зруйновану утиліту під назвою WS-MakeStubs. Я не думаю, що це доступно на iPhone, але вас також може зацікавити бібліотека з відкритим кодом, призначена замінити це - генерування коду Objective-C для взаємодії з клієнтом SOAP. Знову ж таки, я не користувався цим, але я зазначив це у своїх замітках: wsdl2objc


Дякую, я спробував використовувати wsdl2objc. Генерація коду ObjectiveC з WSDL працює, але (як і очікувалося) не компілюється безпосередньо проти 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 коду, який виконує виклики API, використовуючи формат служби 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()
    }

0

Подивіться тут на це посилання та їх дорожню карту. Вони мають RO | C на шляху, і вони можуть підключатися до їх веб-служб, що, ймовірно, включає SOAP (я використовую версію VCL, яка, безумовно, включає її).


0

Погляньте на gsoap, який включає два приклади iOS в пакет завантаження під ios_plugin. Інструмент перетворює WSDL в код для SOAP та XML REST.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.