Вызов веб сервиса и передача XML файла

1. ZhakeKZ 07.11.17 07:46 Сейчас в теме
Доброе время суток,

Мне необходимо вызвать веб сервис и ему передать xml файл.
Есть пример на Java.


    public static void main(String[] args) throws IOException{
        URL url = new URL("http://url сервиса/corews?wsdl");
        QName qname= new QName("http://пространство имен/", "CoreWebServiceImplService");
        Service service = Service.create(url, qname);
        CoreWebService hello=service.getPort(CoreWebService.class);

        Map<String, Object> req_ctx = ((BindingProvider)hello).getRequestContext();
        req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://url сервиса/corews?wsdl");

        Map<String, List<String>> headers = new HashMap<String, List<String>>();
        headers.put("Username", Collections.singletonList("логин"));
        headers.put("Password", Collections.singletonList("пароль"));
        req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
        String entity_val =  readFile("путь до xml файла", StandardCharsets.UTF_8);

        System.out.println(entity_val);
        System.out.println(hello.createEntities(entity_val, 201,"XML"));
    }

Показать


Создал WS-сслыку в конфигураторе.
И пока написал так:
&НаСервере
Процедура pTopHR()
	Прокси = WSСсылки.CoreWebServ.СоздатьWSПрокси("http://пространство имен/", "CoreWebServiceImplService", "CoreWebServiceImplPort");	
	ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://пространство имен/");
	Сообщить("Пакеты получены");		
КонецПроцедуры

Показать


Как быть дальше ?
Нужно код под Java переделать под 1С83 УФ.
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
9. ZhakeKZ 23.11.17 07:57 Сейчас в теме
В итоге получилось так:
	Прокси = WSСсылки.Local.СоздатьWSПрокси("http://core.webservice.config.core.auction.bas.com/","CoreWebServiceImplService","CoreWebServiceImplPort");
	Схема="http://www.w3.org/2001/XMLSchema";
	
	ТипXDTO_data_content =  Прокси.ФабрикаXDTO.Тип(Схема, "string");
	ОбъектXDTO_data_content = Прокси.ФабрикаXDTO.Создать(ТипXDTO_data_content,"Даннные");
  
	ТипXDTO_batchId = Прокси.ФабрикаXDTO.Тип(Схема, "int");
  	ОбъектXDTO_batchId = Прокси.ФабрикаXDTO.Создать(ТипXDTO_batchId,201);

	ТипXDTO_data_type = Прокси.ФабрикаXDTO.Тип(Схема, "string");
  	ОбъектXDTO_data_type = Прокси.ФабрикаXDTO.Создать(ТипXDTO_data_type,"XML");
	
	ДанныеОтправки = Прокси.createEntities(ОбъектXDTO_data_content, ОбъектXDTO_batchId, ОбъектXDTO_data_type); 
	Сообщить(ДанныеОтправки);

Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Dream_kz 129 07.11.17 09:11 Сейчас в теме
(1) Пример вызова веб-сервиса 1С-ного из 1С:
	login = "login "; 
	password = "password ";
	
	АдресСервера = "ya.ru";	
	ВСОпределение = Новый WSОпределения("http://"+ АдресСервера + "/OrdersEnt/ws/DataTransfer?wsdl",login,password,,,);
	ВСервис       = ВСОпределение.Сервисы.Получить("DataTransfer","DataTransfer");
    ВТочкаВхода   = ВСервис.ТочкиПодключения.Получить("DataTransferSoap");
	ВОперация     = ВТочкаВхода.Интерфейс.Операции.Получить(ИмяФункции);    
    
	ВСПрокси = Новый WSПрокси(ВСОпределение, "DataTransfer","DataTransfer","DataTransferSoap",,,); 
	ВСПрокси.Пользователь = login;
	ВСПрокси.Пароль = password;
	
	Ответ = "";
	Если ИмяФункции = "Auth" Тогда
		Ответ = ВСПрокси.Auth("Тут передаем файл, в формате, который просит веб-сервис");
	ИначеЕсли ИмяФункции = "Sync" Тогда
		Ответ = ВСПрокси.Sync("Тут передаем файл, в формате, который просит веб-сервис");
	КонецЕсли;

	Возврат Ответ;
Показать
3. ZhakeKZ 07.11.17 09:59 Сейчас в теме
Развернул сервис локально.
http://127.0.0.1/corews?wsdl возвращает:
wsdl
4. succub1_5 89 07.11.17 10:34 Сейчас в теме
лучше не web-сервис сделайте, а http - больше возможностей, проще проверять (postman), быстрее скорость (объективно).
5. ZhakeKZ 07.11.17 11:14 Сейчас в теме
(4) http может возможности Web сервиса ?
6. succub1_5 89 07.11.17 11:16 Сейчас в теме
(5)да, кстати вот на инфостарте, чтоб не дублировать: https://forum.infostart.ru/forum92/topic143299/
7. Aitbay 07.11.17 11:59 Сейчас в теме
Лучше конечно Http сервис
1. Создай HTTP-сервис
Функция OracleDataSync(HttpЗапрос)
 	Ответ = Новый Структура;
	Ответ.Вставить("Status"      , "Ok");
	Ответ.Вставить("Description" , "Работает");
	КодОтвета = 200;	
	Попытка
		Параметры =  JSONКлиентСервер.ПрочитатьJSON_1(HttpЗапрос.ПолучитьТелоКакСтроку("utf-8"));
	Исключение
		Ответ.Вставить("Status"      , "Error");
		Ответ.Вставить("Description" , ОписаниеОшибки());
		HTTPОтвет = Новый HTTPСервисОтвет(400);
		HTTPОтвет.УстановитьТелоИзСтроки(JSONКлиентСервер.ЗаписатьJSON_1(Ответ), КодировкаТекста.UTF8);
		Возврат HTTPОтвет;
	КонецПопытки;
	Если Параметры = Неопределено Тогда
		Ответ.Вставить("Status"      , "Error");
		Ответ.Вставить("Description" , "Отсутствуют данные для обработки");
		КодОтвета = 400;
		HTTPОтвет = Новый HTTPСервисОтвет(КодОтвета);
		HTTPОтвет.Заголовки.Вставить("Content-Type","application/json;charset=utf-8");
		HTTPОтвет.УстановитьТелоИзСтроки(JSONКлиентСервер.ЗаписатьJSON_1(Ответ),КодировкаТекста.UTF8);
		Возврат HTTPОтвет;
	КонецЕсли;
//********************
//Здесь обработка принятых параметров
// все значения получают примерно так Параметры["category"]
// проверка наличия свойства ЗначениеЗаполнено(Параметры["category"])
//********************
        
	Если Ответ.Status = "Error" Тогда
		КодОтвета = 400;
	Иначе
		КодОтвета = 200;
	КонецЕсли; 
	////	
	HTTPОтвет = Новый HTTPСервисОтвет(КодОтвета);
	HTTPОтвет.УстановитьТелоИзСтроки(JSONКлиентСервер.ЗаписатьJSON_1(Ответ), КодировкаТекста.UTF8);
	Возврат HTTPОтвет;

КонецФункции
Показать

текст json выглядит примерно так
{
  "ИмяПарамтера":"Значение",
//Если нужен массив тогда такая конструкция
  "ИмяМассива": [
"Значение1",
"Значение2",
"Значение3"
]
}


// вызов из 1с

//сначала создается и заполняется структура параметров допустим ПараметрыОтправки

		Попытка
			HTTPСоединение = Новый HTTPСоединение("Адрес сервера где опубликован сервис", НомерПорта); 
			HTTPЗапрос = Новый HTTPЗапрос("СтрокаВызоваСервиса");
			HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");

			ЗаписьJSON      = Новый ЗаписьJSON;
			ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПредопределенноеЗначение("ПереносСтрокJSON.Авто"));
			ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписи);
			
			НастройкиСериализации = Новый НастройкиСериализацииJSON;
			НастройкиСериализации.ВариантЗаписиДаты      = ПредопределенноеЗначение("ВариантЗаписиДатыJSON.ЛокальнаяДата");
			НастройкиСериализации.ФорматСериализацииДаты = ПредопределенноеЗначение("ФорматДатыJSON.ISO");
			
			ЗаписатьJSON(ЗаписьJSON, ПараметрыОтправки, НастройкиСериализации, "ПреобразованиеЗначений");

			HTTPЗапрос.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть(),"UTF-8", ИспользованиеByteOrderMark.НеИспользовать);
			HTTPОтвет = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
			Если HTTPОтвет.КодСостояния = 200 или HTTPОтвет.КодСостояния = 201 Тогда
                              //Обработка если успешный ответ

			Иначе
				//Обработка если неудачный ответ
			КонецЕсли;

			
		Исключение
			Сообщить(ОписаниеОшибки());
		КонецПопытки;
Показать

както так
8. ZhakeKZ 17.11.17 09:59 Сейчас в теме
Все таки от меня потребовали использовать Веб сервис.

Шаги через SoapUI:
1) Нажал на кнопку SOAP. Ввел адрес wsdl и нажал Ок.
2) Раскрыл созданный проект и нажал на Request.
3) В окошке запроса SOAP, вставил содержимое свое XML файла в качесте параметра.
4) Ниже данного окна через Headers, добавил дополнительные параметры.
5) Нажал на Submit request. Запрос был отправлен на указанный веб сервис и получил положительный ответ.


Теперь в 1С83 мне надо повторить эти действия:
1) Запустил Конфигуратор.
2) В дереве конфигурации - Общие, WS-ссылки нажал Добавить. Ввел адрес wsdl и нажал Ок.
Как дальше быть ?
9. ZhakeKZ 23.11.17 07:57 Сейчас в теме
В итоге получилось так:
	Прокси = WSСсылки.Local.СоздатьWSПрокси("http://core.webservice.config.core.auction.bas.com/","CoreWebServiceImplService","CoreWebServiceImplPort");
	Схема="http://www.w3.org/2001/XMLSchema";
	
	ТипXDTO_data_content =  Прокси.ФабрикаXDTO.Тип(Схема, "string");
	ОбъектXDTO_data_content = Прокси.ФабрикаXDTO.Создать(ТипXDTO_data_content,"Даннные");
  
	ТипXDTO_batchId = Прокси.ФабрикаXDTO.Тип(Схема, "int");
  	ОбъектXDTO_batchId = Прокси.ФабрикаXDTO.Создать(ТипXDTO_batchId,201);

	ТипXDTO_data_type = Прокси.ФабрикаXDTO.Тип(Схема, "string");
  	ОбъектXDTO_data_type = Прокси.ФабрикаXDTO.Создать(ТипXDTO_data_type,"XML");
	
	ДанныеОтправки = Прокси.createEntities(ОбъектXDTO_data_content, ОбъектXDTO_batchId, ОбъектXDTO_data_type); 
	Сообщить(ДанныеОтправки);

Показать
10. ZhakeKZ 28.06.19 12:38 Сейчас в теме
Теперь возник вопрос передать заголовок сообщения (http_headers).
11. Sashares 34 28.06.19 12:41 Сейчас в теме
(10)
Использовать HTTPСоединение.
12. ZhakeKZ 28.06.19 17:13 Сейчас в теме
(11)
	ТекТекст="<Root_1C>
	| <CatalogObject.ПодразделенияОрганизаций name=""CatalogObject.ПодразделенияОрганизаций"">
	| <Ref>1001-1-1002</Ref>
	| <DeletionMark>0</DeletionMark>
	| <Description>Администрация</Description>
	| <MainDivision>0</MainDivision>
	| <ParentCode></ParentCode>
	| </CatalogObject.ПодразделенияОрганизаций>
	| </Root_1C>";
		
	
	СтрокаSOAP = "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:core=""http://core.webservice.config.core.auction.bas.com/"">
	| <soapenv:Header/>
	| <soapenv:Body>
    |  <core:createEntities>
    |     <data_content>![CDATA["+СокрЛП(ТекТекст)+"]]</data_content>
    |     <data_type>xml</data_type>
	|	  <batchId>201</batchId>
    |  </core:createEntities>
	| </soapenv:Body>
	|</soapenv:Envelope>";


	Заголовки = Новый Соответствие;

	Заголовки.Вставить("Content-Type", "text/xml;charset=UTF-8");
	//Заголовки.Вставить("SOAPAction", "https://dev.tophr.kz/corews");
	Заголовки.Вставить("SOAPAction", "http://dev-data.cloudmaker.kz/corews");
	//Заголовки.Вставить("Authorization", "Basic "+ПолучитьBase64ЗаголовокАвторизации(ИмяПользователя, Пароль));
	Соединение = Новый HTTPСоединение("dev-data.cloudmaker.kz",,,,,,,Ложь); // Адрес должен быть без https://

	HTTPЗапрос = Новый HTTPЗапрос("/corews?wsdl", Заголовки);
	HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаSOAP);
	Результат = Соединение.ВызватьHTTPМетод("POST", HTTPЗапрос);
	
	Сообщить(Результат.КодСостояния);

Показать


Я передавал
<data_content>![CDATA["+СокрЛП(ТекТекст)+"]]</data_content>

В туда пришло только "]]"
Что не правильно сделано ?
13. Sashares 34 28.06.19 17:27 Сейчас в теме
(12)Установите Fiddler, в нем будет видно что уходит.
Если уходит не корректно, то можно попробовать обойти - сначала записать в файл полный soap пакет, а потом установить тело запроса из двоичных данных. В этом случае платформа не должна ничего своего добавлять.
14. ZhakeKZ 28.06.19 17:50 Сейчас в теме
Вместо CDATA попробовал сделать замену,
	ТекТекст=СтрЗаменить(ТекТекст,"&","& amp;");
	ТекТекст=СтрЗаменить(ТекТекст,"<","& lt;");
	ТекТекст=СтрЗаменить(ТекТекст,">","& gt;");
	ТекТекст=СтрЗаменить(ТекТекст,"""","& quot;");
	ТекТекст=СтрЗаменить(ТекТекст,"'","& apos;");

Дошло нормально.
Sashares; +1 Ответить
Оставьте свое сообщение

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