1. olenka-ul 3 08.11.18 14:16 Сейчас в теме

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

Всем привет!
Подскажите пожалуйста, как правильно написать процедуру отправки 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. 89 08.11.18 14:21 Сейчас в теме
WSСсылка вас чем не устраивает?
4. olenka-ul 3 08.11.18 14:38 Сейчас в теме
(2) просто я с ними никогда не работала, а времени разбираться нет. Нужно сделать быстро.
7. t.v.s. 89 08.11.18 14:46 Сейчас в теме
(4)
Некий человек увидел в лесу дровосека, с большим трудом пилившего дерево совершенно тупой пилой. Человек спросил дровосека:
- Уважаемый, почему бы вам не наточить свою пилу?
- У меня нет времени точить пилу, я должен пилить! - простонал дровосек
3. echo77 1058 08.11.18 14:37 Сейчас в теме
5. olenka-ul 3 08.11.18 14:39 Сейчас в теме
(3) спасибо, но у меня платформа 8.3.
6. echo77 1058 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 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 344 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 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 13.11.18 11:51 Сейчас в теме
Точно метод должен быть просто AddOrganization.
20. olenka-ul 3 13.11.18 12:30 Сейчас в теме
(19)Ага, сделала так:
Результат = ВебСервис.addOrganization(Credentials, "Эконика", "Добавлена программно");

Получаю ошибку: Слишком много фактических параметров
22. wertep 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 13.11.18 12:53 Сейчас в теме
(21) Должны быть указаны правильные
email = "..."; 
password = "..."; 
24. olenka-ul 3 13.11.18 12:56 Сейчас в теме
(23) они правильные, в пользовательском режиме захожу без проблем...
25. wertep 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 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Ответ.ПолучитьТелоКакСтроку(); 
	КонецЕсли; 
Исключение 
КонецПопытки;
Показать
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Санкт-Петербург
зарплата от 130 000 руб.
Полный день

Программист 1С
Москва
Полный день

Программист 1С
Видное
Полный день

Программист 1С
Москва
зарплата до 120 000 руб.
Полный день

Программист 1С
Ростов-на-Дону
зарплата до 120 000 руб.
Полный день