Вызов веб сервиса и передача XML файла
Доброе время суток,
Мне необходимо вызвать веб сервис и ему передать xml файл.
Есть пример на Java.
Создал WS-сслыку в конфигураторе.
И пока написал так:
Как быть дальше ?
Нужно код под Java переделать под 1С83 УФ.
Мне необходимо вызвать веб сервис и ему передать 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 УФ.
По теме из базы знаний
- Некоторые особенности реализации веб-сервисов
- Интеграция 1С:CRM и Asterisk с помощью PHP-AGI и веб-сервисов 1C
- Обмен данными онлайн через Веб-сервис с использованием обработки "Универсальный обмен данными XML"
- Обмен без правил. От простого к сложному
- 5 ситуаций, когда в экосистеме 1C нужны веб-сервисы
Найденные решения
В итоге получилось так:
Прокси = 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);
Сообщить(ДанныеОтправки);
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(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("Тут передаем файл, в формате, который просит веб-сервис");
КонецЕсли;
Возврат Ответ;
Показать
Развернул сервис локально.
http://127.0.0.1/corews?wsdl возвращает:
wsdl |
---|
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://core.webservice.config.core.auction.bas.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://core.webservice.config.core.auction.bas.com/" name="CoreWebServiceImplService">
<types/> <message name="createEntities"> <part name="arg0" type="xsd:string"/> <part name="arg1" type="xsd:int"/> <part name="arg2" type="xsd:string"/> </message> <message name="createEntitiesResponse"> <part name="return" type="xsd:anyType"/> </message> <portType name="CoreWebService"> <operation name="createEntities" parameterOrder="arg0 arg1 arg2"> <input message="tns:createEntities"/> <output message="tns:createEntitiesResponse"/> </operation> </portType> <binding name="CoreWebServiceImplPortBinding" type="tns:CoreWebService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" st yle="rpc"/> <operation name="createEntities"> <soap:operation soapAction=""/> <input> <soap:body use="literal" namespace="http://core.webservice.config.core.auction.bas.com"> </input> <output> <soap:body use="literal" namespace="http://core.webservice.config.core.auction.bas.com"> </output> </operation> </binding> <service name="CoreWebServiceImplService"> <port name="CoreWebServiceImplPort" binding="tns:CoreWebServiceImplPortBinding"> <soap:address location="http://127.0.0.1:8080/corews"/> </port> </service> </definitions> |
(5)да, кстати вот на инфостарте, чтоб не дублировать: https://forum.infostart.ru/forum92/topic143299/
Лучше конечно Http сервис
1. Создай HTTP-сервис
текст json выглядит примерно так
както так
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 Тогда
//Обработка если успешный ответ
Иначе
//Обработка если неудачный ответ
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Показатькакто так
Все таки от меня потребовали использовать Веб сервис.
Шаги через SoapUI:
1) Нажал на кнопку SOAP. Ввел адрес wsdl и нажал Ок.
2) Раскрыл созданный проект и нажал на Request.
3) В окошке запроса SOAP, вставил содержимое свое XML файла в качесте параметра.
4) Ниже данного окна через Headers, добавил дополнительные параметры.
5) Нажал на Submit request. Запрос был отправлен на указанный веб сервис и получил положительный ответ.
Теперь в 1С83 мне надо повторить эти действия:
1) Запустил Конфигуратор.
2) В дереве конфигурации - Общие, WS-ссылки нажал Добавить. Ввел адрес wsdl и нажал Ок.
Как дальше быть ?
Шаги через SoapUI:
1) Нажал на кнопку SOAP. Ввел адрес wsdl и нажал Ок.
2) Раскрыл созданный проект и нажал на Request.
3) В окошке запроса SOAP, вставил содержимое свое XML файла в качесте параметра.
4) Ниже данного окна через Headers, добавил дополнительные параметры.
5) Нажал на Submit request. Запрос был отправлен на указанный веб сервис и получил положительный ответ.
Теперь в 1С83 мне надо повторить эти действия:
1) Запустил Конфигуратор.
2) В дереве конфигурации - Общие, WS-ссылки нажал Добавить. Ввел адрес wsdl и нажал Ок.
Как дальше быть ?
В итоге получилось так:
Прокси = 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);
Сообщить(ДанныеОтправки);
Показать
(11)
Я передавал
<data_content>![CDATA["+СокрЛП(ТекТекст)+"]]</data_content>
В туда пришло только "]]"
Что не правильно сделано ?
ТекТекст="<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>
В туда пришло только "]]"
Что не правильно сделано ?
(12)Установите Fiddler, в нем будет видно что уходит.
Если уходит не корректно, то можно попробовать обойти - сначала записать в файл полный soap пакет, а потом установить тело запроса из двоичных данных. В этом случае платформа не должна ничего своего добавлять.
Если уходит не корректно, то можно попробовать обойти - сначала записать в файл полный soap пакет, а потом установить тело запроса из двоичных данных. В этом случае платформа не должна ничего своего добавлять.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот