Отправка 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 1868 08.11.18 14:37 Сейчас в теме
5. olenka-ul 3 08.11.18 14:39 Сейчас в теме
(3) спасибо, но у меня платформа 8.3.
6. echo77 1868 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 Сейчас в теме
Спасибо за обсуждение ошибки , было очень полезно!
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

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

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

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

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)