ios - Как получить доступ к SOAP-сервисам с iPhone




web-services wsdl (7)

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

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

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

Геро


Answers

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

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

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

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


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

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

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


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


Вот быстрый код примера, который выполняет вызов 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()
    }

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

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

Не самый элегантный, но прочный.


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


Быстрая сдержанность на 2012 вопрос:

Области, в которых REST отлично работают, - это:

  • Ограниченная пропускная способность и ресурсы. Помните, что структура возврата действительно в любом формате (разработчик определен). Кроме того, любой браузер можно использовать, поскольку подход REST использует стандартные команды GET, PUT, POST и DELETE. Опять же, помните, что REST также может использовать объект XMLHttpRequest, который поддерживает большинство современных браузеров, что добавляет дополнительный бонус AJAX.

  • Полностью без гражданства. Если операция должна быть продолжена, то REST не лучший подход, и SOAP может поместиться лучше. Однако, если вам нужны операции CRUD (создание, чтение, обновление и удаление) без учета состояния, тогда это REST.

  • Кэширование ситуаций. Если информация может быть кэширована из-за полностью безгосударственной операции подхода REST, это идеально. Это охватывает множество решений в трех предыдущих.

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

  • Асинхронная обработка и вызов. Если ваше приложение нуждается в гарантированном уровне надежности и безопасности, SOAP 1.2 предлагает дополнительные стандарты для обеспечения такого типа работы. Такие вещи, как WSRM - WS-Reliable Messaging.

  • Формальные контракты. Если обе стороны (поставщик и потребитель) должны согласовать формат обмена, то SOAP 1.2 дает жесткие спецификации для такого типа взаимодействия.

  • Стойкие операции. Если для приложения требуется контекстная информация и управление диалоговым состоянием, SOAP 1.2 имеет дополнительную спецификацию в структуре WS * для поддержки этих вещей (безопасность, транзакции, координация и т. Д.). Сравнительно, подход REST заставил бы разработчиков построить эту обычную сантехнику.

http://www.infoq.com/articles/rest-soap-when-to-use-each





iphone ios web-services soap wsdl