Як отримати доступ до послуг 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.