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

224

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

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

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

Геро

Геро
источник
9
Привет Геро, какой мыльный сервис ты использовал для твоего применения. так как вы не упомянули ни одного правильного ответа.
Ameya
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 минут.

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

davidjhinson
источник
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

heckj
источник
Спасибо, я пытался использовать 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];
Bennya
источник
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, которая, безусловно, включает ее).

mj2008
источник
0

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

Доктор Алекс RE
источник