Отправка SOAP-запроса

1. olenka-ul 3 08.11.18 14:16 Сейчас в теме
Всем привет!
Подскажите пожалуйста, как правильно написать процедуру отправки http-запроса.
Мой текст такой:

AccountUrl = "http://econika-dev.ispringonline.ru";
email = "...";
password = "...";
Хост = "api.ispringonline.ru";

SSL = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);
Соединение = Новый HTTPСоединение(Хост, , , , ,10,SSL);

СтрокаXML = "
|<?xml version=""1.0"" encoding=""utf-8""?>
|<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/""
| xmlns=""http://ispringlearn.com/go/services/api/soap"">
| <SOAP-ENV:Body>
| <getOrganizationsRequest>
| <credentials>
| <accountUrl>"+AccountUrl+"</accountUrl>
| <email>"+email+"</email>
| <password>"+password+"</password>
| </credentials>
| </getOrganizationsRequest>
| </SOAP-ENV:Body>
|</SOAP-ENV:Envelope>";

Попытка
HTTPЗапрос = Новый HTTPЗапрос();

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаXML);

HTTPОтвет = Соединение.ВызватьHTTPМетод("getOrganizations", HTTPЗапрос);

Если HTTPОтвет.КодСостояния <> 200 Тогда
Ответ = HTTPОтвет.ПолучитьТелоКакСтроку();
КонецЕсли;
Исключение

КонецПопытки;
На всякий случай, вот описание интеграции https://www.ispring.ru/docs/pages/viewpage.action?pageId=4817403
Всем заранее спасибо!
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. spacecraft 08.11.18 15:51 Сейчас в теме
(1) обязательно SOAP? Чем REST не устраивает?
Интеграции с базой нет. Платформа 8.3. Прямо напрашивается использовать REST.
10. olenka-ul 3 08.11.18 16:01 Сейчас в теме
(9) Сделала интеграцию по REST, она работает, но проблема в том, что нельзя передавать значения в кириллице. Даже если указать кодировку utf-8.
Как сказали специалисты на той стороне, интеграция через soap не имеет проблем с кириллицей.
11. spacecraft 08.11.18 16:03 Сейчас в теме
(10) что тут сказать. "Крутые" там специалисты. Сочувствую.
12. olenka-ul 3 08.11.18 16:10 Сейчас в теме
(11) тогда может быть подскажете, как быть с кириллицей?
13. spacecraft 08.11.18 16:19 Сейчас в теме
(12) это не ко мне. Это к тем "специалистам", которые сервис делали.
2. t.v.s. 111 08.11.18 14:21 Сейчас в теме
WSСсылка вас чем не устраивает?
4. olenka-ul 3 08.11.18 14:38 Сейчас в теме
(2) просто я с ними никогда не работала, а времени разбираться нет. Нужно сделать быстро.
7. t.v.s. 111 08.11.18 14:46 Сейчас в теме
(4)
Некий человек увидел в лесу дровосека, с большим трудом пилившего дерево совершенно тупой пилой. Человек спросил дровосека:
- Уважаемый, почему бы вам не наточить свою пилу?
- У меня нет времени точить пилу, я должен пилить! - простонал дровосек
3. echo77 1880 08.11.18 14:37 Сейчас в теме
5. olenka-ul 3 08.11.18 14:39 Сейчас в теме
(3) спасибо, но у меня платформа 8.3.
6. echo77 1880 08.11.18 14:40 Сейчас в теме
Еще. Отсюда качаем WSDL-файл, импортируем WS-ссылку и поехали https://www.ispring.ru/docs/display/online/SOAP+API
8. olenka-ul 3 08.11.18 15:43 Сейчас в теме
(6) вот после поехали и начинается самое интересное)
14. wertep 23 09.11.18 16:32 Сейчас в теме
Именно с SOAP работать проще если понимать что в 1С это называется web-сервис.

Код получается простым и понятным.
Определения = Новый WSОпределения(ФайлИлиURL_WSDL);
Прокси = Новый WSПрокси(Определения, "ИмяСхемы_WSDL", "ИмяСервиса_WSDL", "ИмяПорта_WSDL");
	
Результат = Прокси.ИмяВызываемойФункции_WSDL(Параметр_1, ..... Параметр_N);


В вашем случае скорее всего надо будет заменить
ИмяВызываемойФункции_WSDL = getOrganizationsRequest
ИмяСхемы_WSDL = http://ispringlearn.com/go/services/api/soap
Остальное поискать в WSDL-файле. Обычно ИмяСервиса_WSDL оканчивается на "Service", а ИмяПорта_WSDL на "Port".

Параметры авторизации настроить у объекта "Прокси".
15. nomadon 367 11.11.18 00:59 Сейчас в теме
Подход интересный, а что если я буду тоже с работы постить задачи, объявлю вознаграждение, даже 5 sm сильно дешевле фрилансеров
16. olenka-ul 3 12.11.18 11:35 Сейчас в теме
Сделала вот так:
//Добавление организации
	
AccountUrl    = "http://econika-dev.ispringonline.ru";
	email        = "...";
	password        = "...";
	
	Пакет = "http://ispringlearn.com/go/services/api/soap";
	ВебСервис = WSСсылки.WSИнтеграцияiSpring.СоздатьWSПрокси(Пакет, "iSpringOnlineService", "iSpringOnlineSoap");
	ВебСервис.Пароль            = password;
	ВебСервис.Пользователь      = email; 
	
	
	ТипПараметраCredentials = ВебСервис.ФабрикаXDTO.Тип(Пакет,"Credentials"); 
	Credentials = ВебСервис.ФабрикаXDTO.Создать(ТипПараметраCredentials); 
		
	Credentials.accountUrl = ВебСервис.ФабрикаXDTO.Создать(ВебСервис.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"), AccountUrl); 
	Credentials.email = ВебСервис.ФабрикаXDTO.Создать(ВебСервис.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"), email);
	Credentials.password = ВебСервис.ФабрикаXDTO.Создать(ВебСервис.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"), password);

	ТипAddOrganizationRequest = ВебСервис.ФабрикаXDTO.Тип(Пакет,"AddOrganizationRequest");
	AddOrganizationRequest = ВебСервис.ФабрикаXDTO.Создать(ТипAddOrganizationRequest);
	
	AddOrganizationRequest.name = ВебСервис.ФабрикаXDTO.Создать(ВебСервис.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"), "Эконика"); 
	AddOrganizationRequest.Credentials = Credentials;
	AddOrganizationRequest.description = ВебСервис.ФабрикаXDTO.Создать(ВебСервис.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "string"), "Добавлена программно");	
	
	Результат = ВебСервис.addOrganization(AddOrganizationRequest);
Показать

В результате получаю ошибку авторизации:

При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ispringlearn.com/go/services/api/soap}:iSpringOnlineService:addOrganization()
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка SOAP сервера: Authorization failed
Код ошибки: client
17. wertep 23 12.11.18 16:34 Сейчас в теме
(16)
Сделала вот так:

Зачем некоторые сложности?
Авторизация у вас реализована параметром функции, и вы пошли правильным путем при этом к прокси не нужно никаких паролей.
AccountUrl = "http://econika-dev.ispringonline.ru"; 
email = "..."; 
password = "..."; 

Определения = Новый WSОпределения("https://api.ispringonline.com/soap/1.2/api?wsdl");
ВебСервис = Новый WSПрокси(Определения, "http://ispringlearn.com/go/services/api/soap", "iSpringOnlineService", "iSpringOnlineSoap");

ТипПараметраCredentials = ВебСервис.ФабрикаXDTO.Тип("http://ispringlearn.com/go/services/api/soap","Credentials"); 
Credentials = ВебСервис.ФабрикаXDTO.Создать(ТипПараметраCredentials);

Credentials.accountUrl = AccountUrl;
Credentials.email = email; 
Credentials.password = password; 
    
Результат = ВебСервис .AddOrganizationRequest(Credentials, "Эконика", "Добавлена программно");
Показать
18. olenka-ul 3 12.11.18 22:30 Сейчас в теме
(17) Спасибо. В таком виде выходит др. ошибка:
Метод объекта не обнаружен (AddOrganizationRequest)
Результат = ВебСервис.AddOrganizationRequest(Credentials, "Эконика", "Добавлена программно");
19. wertep 23 13.11.18 11:51 Сейчас в теме
Точно метод должен быть просто AddOrganization.
20. olenka-ul 3 13.11.18 12:30 Сейчас в теме
(19)Ага, сделала так:
Результат = ВебСервис.addOrganization(Credentials, "Эконика", "Добавлена программно");

Получаю ошибку: Слишком много фактических параметров
22. wertep 23 13.11.18 12:50 Сейчас в теме
(20) Ага, хитрый сервис, хочет получить только один параметр. Добавляем еще немного кода.
AccountUrl = "http://econika-dev.ispringonline.ru"; 
email = "..."; 
password = "..."; 

Определения = Новый WSОпределения("https://api.ispringonline.com/soap/1.2/api?wsdl");
ВебСервис = Новый WSПрокси(Определения, "http://ispringlearn.com/go/services/api/soap", "iSpringOnlineService", "iSpringOnlineSoap");

ТипПараметраCredentials = ВебСервис.ФабрикаXDTO.Тип("http://ispringlearn.com/go/services/api/soap", "Credentials"); 
Credentials = ВебСервис.ФабрикаXDTO.Создать(ТипПараметраCredentials);

Credentials.accountUrl = AccountUrl;
Credentials.email = email; 
Credentials.password = password; 
    
ТипПараметраЗапросОрганизации = ВебСервис.ФабрикаXDTO.Тип("http://ispringlearn.com/go/services/api/soap", "AddOrganizationRequest"); 
AddOrganizationRequest = ВебСервис.ФабрикаXDTO.Создать(ТипПараметраЗапросОрганизации);

AddOrganizationRequest.credentials = Credentials;
AddOrganizationRequest.name = "Эконика";
AddOrganizationRequest.description = "Добавлена программно";

Результат = ВебСервис.addOrganization(AddOrganizationRequest);
Показать
21. olenka-ul 3 13.11.18 12:46 Сейчас в теме
Думаю, что нужно вот так:

AccountUrl = "http://econika-dev.ispringonline.ru"; 
	email = "..."; 
	password = "..."; 
	
	Определения = Новый WSОпределения("https://api.ispringonline.com/soap/1.2/api?wsdl");
	ВебСервис = Новый WSПрокси(Определения, "http://ispringlearn.com/go/services/api/soap", "iSpringOnlineService", "iSpringOnlineSoap");
	
	ТипПараметраCredentials = ВебСервис.ФабрикаXDTO.Тип("http://ispringlearn.com/go/services/api/soap","Credentials"); 
	Credentials = ВебСервис.ФабрикаXDTO.Создать(ТипПараметраCredentials);
	
	Credentials.accountUrl = AccountUrl;
	Credentials.email = email; 
	Credentials.password = password; 
	
	ТипAddOrganizationRequest = ВебСервис.ФабрикаXDTO.Тип("http://ispringlearn.com/go/services/api/soap","AddOrganizationRequest");
	AddOrganizationRequest = ВебСервис.ФабрикаXDTO.Создать(ТипAddOrganizationRequest);
	
	AddOrganizationRequest.Credentials = Credentials;
	AddOrganizationRequest.name = "EkonikaN"; 
	AddOrganizationRequest.description = "Dobavlena programmno";	
	

	Результат = ВебСервис.addOrganization(AddOrganizationRequest);
Показать

Но в таком виде снова получаю ошибку аутентификации:

Ошибка при вызове метода контекста (addOrganization)
Результат = ВебСервис.addOrganization(AddOrganizationRequest);
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://ispringlearn.com/go/services/api/soap}:iSpringOnlineService:addOrganization()
по причине:
При вызове веб-сервиса произошла ошибка. Ошибка SOAP сервера: Authorization failed
Код ошибки: client
23. wertep 23 13.11.18 12:53 Сейчас в теме
(21) Должны быть указаны правильные
email = "..."; 
password = "..."; 
24. olenka-ul 3 13.11.18 12:56 Сейчас в теме
(23) они правильные, в пользовательском режиме захожу без проблем...
25. wertep 23 13.11.18 13:12 Сейчас в теме
(24)
Как-то у них не очень про авторизацию написано. Может еще все таки на вебсервис ее добавить?
ВебСервис.Пользователь = email; 
ВебСервис.Пароль = password; 
26. olenka-ul 3 13.11.18 13:16 Сейчас в теме
(25) Добавляю, но это ничего не меняет, та же ошибка авторизации(
27. spacecraft 13.11.18 13:34 Сейчас в теме
(24) если ругается на Authorization failed, то значит запрос в общем правильный и параметры получены.
Проверяйте имя и пароль. Может где пробел затесался.
Скопируйте из своего кода и вставьте на вход.
Проверьте настройки на сайте. Может там где доступ настраивается.
28. spacecraft 13.11.18 13:43 Сейчас в теме
(21) попробуйте для начала что-то попроще. Скажем получить имя учетки. getAccountName.
Там только Credentials нужно передать. Добейтесь сначала авторизации.
29. olenka-ul 3 14.11.18 13:34 Сейчас в теме
Оказалось, что проблема была на стороне сервиса. Всем спасибо!
30. Healer 1 05.12.18 10:30 Сейчас в теме
Вот так вот:

AccountUrl = "http://econika-dev.ispringonline.ru"; 
email = "..."; 
password = "..."; 
Хост = "api.ispringonline.ru"; 

СтрокаXML = " 
|<?xml version=""1.0"" encoding=""utf-8""?> 
|<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" 
| xmlns=""http://ispringlearn.com/go/services/api/soap""> 
| <SOAP-ENV:Body> 
| <getOrganizationsRequest> 
| <credentials> 
| <accountUrl>"+AccountUrl+"</accountUrl> 
| <email>"+email+"</email> 
| <password>"+password+"</password> 
| </credentials> 
| </getOrganizationsRequest> 
| </SOAP-ENV:Body> 
|</SOAP-ENV:Envelope>"; 

	HTTPЗапрос = Новый HTTPЗапрос(Хост); 
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаXML); 
	Соединение = Новый HTTPСоединение(AccountUrl, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос);

Попытка
	Если HTTPОтвет.КодСостояния <> 200 Тогда 
		Ответ = HTTPОтвет.ПолучитьТелоКакСтроку(); 
	КонецЕсли; 
Исключение 
КонецПопытки;
Показать
31. user1218675 11.05.19 21:20 Сейчас в теме
Спасибо за обсуждение ошибки , было очень полезно!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот