Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
05 июл 2024, 19:25

web-сервис

Автор vitasw, 01 окт 2015, 10:57

0 Пользователей и 1 гость просматривают эту тему.

vitasw

Здравствуйте.
Пытаюсь наваять обращение к внешнему вэб сервису. Формирование запроса вроде как получилось. Возникает ошибка авторизации вида
"Ошибка SOAP сервера:  AuthorizationFailedException: Некорректная авторизация".
Из скудного описания поставщика сервиса есть следующие строки:
ЦитироватьДля авторизации на веб-сервисах используется Basic HTTP Authorization. Логин и пароль передаются в стандартном http-заголовкеAuthorization в формате Basic<token>, где token закодированная в base64 строка <login>:<password>.
Код подключения к сервису:
Определения = Новый WSОпределения("https://partner-api.1c.ru/api/ws/subscription/v2?wsdl",СокрЛП(Объект.Логин),СокрЛП(Объект.Пароль));
ПростанствоИмен="http://api.repository.onec.ru/v2";
Прокси = Новый WSПрокси(Определения, ПростанствоИмен, "PartnerSubscriptionApiServiceImplService", "PartnerSubscriptionApiServiceImplPort");

Насколько я понимаю неверные логин и пароль. При подключении через браузер логин и пароль принимаются. Через сервис - не проходит.
Спасибо за любую помощь.

vitasw

Поговорю, пожалуй сам с собой.
Вопрос решен.
Для WSПрокси нужно тоже задавать пользователя и пароль.

XGRAF

Добрый день, вот и мне пришлось столкнуться с этим web-сервисом
мой код:
   Логин="логин";
   Пароль="пароль";
   Определения = Новый WSОпределения("https://partner-api.1c.ru/api/ws/subscription/v2?wsdl",СокрЛП(Логин),СокрЛП(Пароль));   
    ПростанствоИмен="http://api.repository.onec.ru/v2";   
    Прокси = Новый WSПрокси(Определения, ПростанствоИмен, "PartnerSubscriptionApiServiceImplService", "PartnerSubscriptionApiServiceImplPort");   
   Прокси.Пользователь=логин;
   Прокси.Пароль=пароль;
   ВходныеПараметры = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип(ПростанствоИмен, "checkItsByRegNum"));
   ВходныеПараметры.regNumList = 1234567;
   Попытка
      Ответ      = Прокси.checkItsByRegNum(ВходныеПараметры);
   Исключение
      ИнформацияОбОшибке = ИнформацияОбОшибке();
   КонецПопытки;

_____________________
ОШИБКА в этой строке:    ВходныеПараметры.regNumList = 1234567;
ПИШЕТ:
Ошибка при установке значения атрибута контекста (regNumList)
   ВходныеПараметры.regNumList = 1234567;
по причине:
Несоответствие типов XDTO:
Тип '{http://api.repository.onec.ru/v2}regNumList'; не найден
Значение не может быть установлено свойству, имеющему объектный тип

как правильно передать параметр, и не приведете ли пример правильного кода для решения этой задачи.

stupnikov

   Пример кода с передачей параметра:

   WSОпределение = Новый WSОпределения("https://partner-api.1c.ru/api/ws/industry?wsdl");     
   
   Сервис = WSОпределение.Сервисы[0];     
   Прокси = Новый WSПрокси(WSОпределение, Сервис.URIПространстваИмен, Сервис.Имя, Сервис.ТочкиПодключения[0].Имя);   
   Прокси.Пользователь = "****";
   Прокси.Пароль = "****";

   // Здесь и есть главный секрет

   ЧислоТип = Прокси.ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "long");
   значение = Прокси.ФабрикаXDTO.Создать(числоТип, 1234567);

   ТипregNumList = Прокси.ФабрикаXDTO.Создать(Прокси.ФабрикаXDTO.Тип(Сервис.URIПространстваИмен, "regNumList"));
   ТипregNumList.regNumList.Добавить(значение);   
   
   Результат = Прокси.checkIndustryByRegNum(ТипregNumList);
   
   Сообщить(Результат);
   Вот только "Результат" - возвращается пустой,  как не смотрел прочитать ничего не смог

darys

Работает, если использовать HTTPСоединение:

   ТелоЗапроса = "<Envelope xmlns=""http://schemas.xmlsoap.org/soap/envelope/"">
   |<Body><checkItsByRegNum xmlns=""http://api.repository.onec.ru/v2""><regNumList xmlns=""""><regNumList>
   |777777</regNumList></regNumList></checkItsByRegNum></Body></Envelope>";
   HTTPСоединение = Новый HTTPСоединение("partner-api.1c.ru",, "user", "pas",,, Новый ЗащищенноеСоединениеOpenSSL() );
   HTTPЗапрос = Новый HTTPЗапрос("/api/ws/subscription/v2");
   HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапроса);
   
   HTTPОтвет      = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);
   
   КодСостояния   = HTTPОтвет.КодСостояния;
    ТекстОтвета    = HTTPОтвет.ПолучитьТелоКакСтроку();

В ТекстОтвета будет soap:Envelope который надо пропарсить.
Из чего можно сделать вывод, объект WSПрокси формирует что-то не то.
Подозрение на SOAPAction, который в данном случае остается пустым.
Добавлено: 01 сен 2017, 14:30


А можно еще использовать библиотеку "1С:Библиотека интернет-поддержки пользователей", там есть функция ЗагрузитьСодержимоеИзИнтернет, которая скроет всю магию:

   ТелоЗапроса = "<Envelope xmlns=""http://schemas.xmlsoap.org/soap/envelope/"">
   |<Body><checkItsByRegNum xmlns=""http://api.repository.onec.ru/v2"">
   |<regNumList xmlns=""""><regNumList>7777777</regNumList>
   |</regNumList></checkItsByRegNum></Body></Envelope>";
   
   РезультатПолученияФайла = ИнтернетПоддержкаПользователейКлиентСервер.ЗагрузитьСодержимоеИзИнтернет( "https://partner-api.1c.ru/api/ws/subscription/v2", "user", "pas", Новый Структура("Метод, ФорматОтвета, ДанныеДляОбработки, ФорматДанныхДляОбработки","POST", 1, ТелоЗапроса, 1));


Теги: сервис SOAP 

Похожие темы (2)

Рейтинг@Mail.ru

Поиск