Как получить доступ к SOAP-сервисам с iPhone
Я планирую разработать приложение для iPhone, и это приложение должно будет получить доступ к двум SOAP-сервисам. Выполняя некоторую базовую проверку в iPhone SDK, я не смог найти какую-либо поддержку для доступа к SOAP-сервисам, некоторые из Google Googling привели к выводу, что SOAP в iPhone SDK отсутствует.
Итак, если я хочу создать это приложение, мне нужно будет придумать подход для доступа к SOAP-сервисам с iPhone. Какой был бы лучший подход? Любые лучшие практики? Кто-то уже написал библиотеку, используя функциональность, присутствующую в iPhone SDK, для доступа к службам SOAP?
(Поскольку служба, которой я нуждаюсь в доступе, выставляется другой стороной, и они отображают ее только как SOAP, к сожалению, это не вариант переключения на другой тип интерфейса (например, API на основе REST).
Геро
Ответы
Ответ 1
Одно слово: не надо.
ОК, очевидно, это не настоящий ответ. Но все же SOAP следует избегать любой ценой.;-) Можно ли добавить прокси-сервер между iPhone и веб-сервисом? Возможно, что-то, что преобразует REST в SOAP для вас?
Вы можете попробовать CSOAP, SOAP-библиотеку, которая зависит от libxml2 (которая включена в iPhone SDK).
Я написал свою собственную SOAP framework для OSX. Однако он не активно поддерживается и потребуется некоторое время для подключения к iPhone (вам нужно будет заменить NSXML TouchXML для запуска )
Ответ 2
Мое решение состояло в том, чтобы прокси-сервер принимал REST, выдавал SOAP-запрос и возвращал результат, используя PHP.
Время реализации: 15-30 минут.
Не самый элегантный, но прочный.
Ответ 3
Я исторически откатил свой собственный доступ на низком уровне (генерация XML и синтаксический анализ), чтобы справляться с необходимостью делать запросы стиля SOAP с Objective-C. Тем не менее, имеется доступная библиотека под названием SOAPClient (soapclient), которая является с открытым исходным кодом (лицензия BSD) и доступна в Google Code (mac-soapclient), которые могут представлять интерес.
Я не буду проверять его способности или эффективность, поскольку я никогда не использовал его или не работал с ним API, но он доступен и может обеспечить быстрое решение для вас в зависимости от ваших потребностей.
Apple имела в свое время очень сломанную утилиту WS-MakeStubs. Я не думаю, что он доступен на iPhone, но вы также можете быть заинтересованы в библиотеке с открытым исходным кодом, предназначенной для замены этого кода - генерировать код Objective-C для взаимодействия с клиентом SOAP. Опять же, я не использовал его, но я отметил его в своих заметках: wsdl2objc
Ответ 4
Вы можете подключиться, используя инструмент, который я нашел 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];
Ответ 5
Вы можете использовать
http://easywsdl.com
для создания классов для подключения к вашему веб-сервису.
Ответ 6
Посмотрите здесь эту ссылку и их дорожную карту. У них есть RO | C по дороге, и они могут подключаться к своим веб-сервисам, что, вероятно, включает SOAP (я использую версию VCL, которая определенно включает ее).
Ответ 7
Посмотрите gsoap, который включает в себя два примера iOS в пакете загрузки под ios_plugin. Инструмент преобразует WSDL в код для SOAP и XML REST.
Ответ 8
Вот пример кода 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()
}