Имя: Пароль:
1C
1С v8
Вызов веб-сервиса базы 1с с помощью jquery (js), отсутствует заголовок Access-Co
0 Slavenia
 
28.04.16
15:22
Приветствую, коллеги!

Есть 1с веб-сервис, результат операции которого я безуспешно пытаюсь получить используя jquery функцию $.ajax с методом POST и указанием всех параметров (авторизация на веб-сервисе не требуется).

При попытке отправить запрос в консоли браузера (Firefox) получаю следующее:

"Загрузка смешанного (небезопасного) активного содержимого "<url моего веб-сервиса>" на защищенной странице

"Запрос из постороннего источника заблокирован: Политика одного источника запрещает чтение удаленного ресурса на <url моего веб-сервиса>. (Причина: отсутствует заголовок CORS 'Access-Control-Allow-Origin')."

На других форумах советуют данный заголовок со значением * прописывать в ответе от веб-сервера. Подскажите, как (и возможно ли) это реализовать на стороне 1с (возможно где-либо в настройках веб-сервиса или в генерируемом wsdl-файле) - чтобы в ответе на запрос извне добавлялся вышеприведенный заголовок?

На партнерском подсказали использовать промежуточный php-файл, но возможно кто-либо сталкивался и предложит иной вариант?
1 Юрий Лазаренко
 
28.04.16
15:44
(0) А чем промежуточный php не устраивает? Мы через них базу дергаем с сайта через аякс - шикарно дергается.
2 Slavenia
 
28.04.16
15:48
Возможно есть вариант через настройки веб-сервиса?
3 Serginio1
 
28.04.16
15:52
4 Serginio1
 
28.04.16
15:58
5 Slavenia
 
29.04.16
12:57
(4) Про это и толкую в (0), можно ли без прослойки из php инициировать передачу этого заголовка в ответе от веб-сервиса 1с на POST-запрос со стороннего сайта, написанный на jquery?
6 Карупян
 
29.04.16
13:12
сайт https  а веб сервис http?
7 4St
 
29.04.16
13:47
(5) речь точно идёт о прикладном объекте "webсервис" (т.е. soap), а не "httpсервис" (rest)?
8 Serginio1
 
29.04.16
15:52
(5) Там же написано как это сделать. Нужно в заголовках указывать доверенные сайты
9 PRO100 NigGaZ
 
29.04.16
16:04
(0) блин, только что столкнулся с такой же ошибкой :[
10 PRO100 NigGaZ
 
29.04.16
17:03
Ответ.Заголовки.Вставить("Access-Control-Allow-Origin","*");
11 Slavenia
 
02.06.16
16:09
(6) Да. Именно так.
12 Slavenia
 
02.06.16
16:11
(7) веб-сервис.
13 Slavenia
 
02.06.16
16:23
Попробовал через php-файл: с https-ресурса вызываю php-файл (с помощью jquery ajax), который находится на http-ресурсе.
Содержимое php-файла следующее:
<?php

header('Access-Control-Allow-Origin; *');

$ch = curl_init();

$headers = array(
    'Content-type: application/xml',
    'Access-Control-Allow-Origin: *',
);

$data = '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"; xmlns:sof="http://ресурс">;
   <soap:Header/>
   <soap:Body>
      <sof:GetCustomerInfo>
         <sof:INN>1234567890</sof:INN>
      </sof:GetCustomerInfo>
   </soap:Body>
</soap:Envelope>';

curl_setopt($ch, CURLOPT_URL, 'http://веб-сервис');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);


$res = curl_exec($ch);

curl_close($ch);

?>
Подскажите, что не так делаю?
14 Fragster
 
гуру
02.06.16
16:26
для httpсервиса:
Процедура ЗаполнитьЗаголовки(Запрос, Ответ)
    
    Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Authorization,Content-type");
    Ответ.Заголовки.Вставить("Access-Control-Allow-Credentials", "true");
    Если Ложь Тогда Запрос = Новый HTTPЗапрос; КонецЕсли;
    Origin = Запрос.Заголовки.Получить("Origin");
    Если Origin = Неопределено Тогда
        Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
    Иначе
        Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", Origin);
    КонецЕсли;    
    
КонецПроцедуры

Функция ШаблонOptions(Запрос)
    
    Ответ = Новый HTTPСервисОтвет(200);
    ЗаполнитьЗаголовки(Запрос, Ответ);
    Возврат Ответ;
    
КонецФункции
15 Fragster
 
гуру
02.06.16
16:27
(13) всё
16 Юрий Лазаренко
 
02.06.16
16:29
(13) Следует добавить
echo($res)
17 Fragster
 
гуру
02.06.16
16:29
для обращению к вебсервису 1с из php

ini_set("soap.wsdl_cache_enabled", "0");


$client = new SoapClient(".....?wsdl",
array(
'login' => '...',
'password' => '...',
'trace' => true,
'features' => SOAP_USE_XSI_ARRAY_TYPE,
//'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP | 5
  )
);
18 Slavenia
 
03.06.16
19:08
Добавил настройку curl CURLOPT_RETURNTRANSFER для сохранения результата в переменную $res, добавил заголовки header...
В итоге вызов php-файла со следующим содержимым отработал корректно:

<?php

$ch = curl_init();

$data = '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"; xmlns:sof="http://ресурс">;
   <soap:Header/>
   <soap:Body>
      <sof:GetCustomerInfo>
         <sof:INN>1234567890</sof:INN>
      </sof:GetCustomerInfo>
   </soap:Body>
</soap:Envelope>';

curl_setopt($ch, CURLOPT_URL, 'http://<url веб-сервиса>');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);


$res = curl_exec($ch);
// завершение сеанса и освобождение ресурсов
curl_close($ch);

echo($res);

header('Access-Control-Allow-Origin:https://<url сайта, с которого идет вызов>');  
header('Access-Control-Allow-Credentials:true');  
header('Access-Control-Allow-Headers: x-csrf-token');  


?>

Всем спасибо за помощь.
Основная теорема систематики: Новые системы плодят новые проблемы.