Как получить доступ к SOAP-сервисам с iPhone - PullRequest
224 голосов
/ 15 октября 2008

Я планирую разработать приложение для iPhone, и этому приложению потребуется доступ к нескольким сервисам SOAP. Выполняя некоторую базовую проверку в iPhone SDK, я не смог найти никакой поддержки для доступа к сервисам SOAP, но небольшое прибегание к гуглингу привело к выводу, что в iPhone SDK нет поддержки SOAP.

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

(Так как служба, к которой мне нужно получить доступ, предоставляется другой стороной, и они предоставляют ее только как SOAP, к сожалению, нет возможности переключиться на интерфейс другого типа (например, API на основе REST).

Геро

Ответы [ 7 ]

52 голосов
/ 15 октября 2008

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

ОК, очевидно, это не настоящий ответ. Но все же SOAP следует избегать любой ценой. ;-) Можно ли добавить прокси-сервер между iPhone и веб-сервисом? Возможно, что-то, что превращает REST в SOAP для вас?

Вы могли бы попробовать CSOAP , библиотеку SOAP, которая зависит от libxml2 (который включен в iPhone SDK).

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

7 голосов
/ 22 декабря 2008

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

Время реализации: 15-30 минут.

Не самый элегантный, но солидный.

4 голосов
/ 15 октября 2008

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

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

В свое время у Apple была очень сломанная утилита под названием WS-MakeStubs. Я не думаю, что это доступно на iPhone, но вас также может заинтересовать библиотека с открытым исходным кодом, предназначенная для ее замены - код генерирует Objective-C для взаимодействия с SOAP-клиентом. Снова, я не использовал это - но я отметил это в моих примечаниях: wsdl2objc

2 голосов
/ 25 декабря 2017

Вот пример кода swift 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()
    }
2 голосов
/ 29 января 2013

Вы можете подключиться с помощью инструмента, который я нашел 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];
0 голосов
/ 28 февраля 2016

Взгляните на gsoap , который включает два примера iOS в пакете загрузки под ios_plugin. Инструмент преобразует WSDL в код для SOAP и XML REST.

0 голосов
/ 15 октября 2008

Взгляните на вот эту ссылку и их дорожную карту. У них есть RO | C, и они могут подключаться к своим веб-службам, которые, вероятно, включают SOAP (я использую версию VCL, которая, безусловно, включает ее).

...