Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

HTTP запрос из 1С

HTTP запрос из 1С
Я
   hoffman064
 
17.06.20 - 13:45
Необходимо получить данные из забикс, как я понимаю первым делом нужно получить хэш ключ. По аналогии с HTTP запрос из 1С  написал следующий код:
СерверПриемник = "zabbix.ru";
АдресСтраницыНаСервере = "zabbix/api_jsonrpc.php";

Таймаут = 120;
HTTP = Новый HTTPСоединение(СерверПриемник,,,,,Таймаут,,);
ЗаголовокЗапросаHTTP = Новый Соответствие();
ЗаголовокЗапросаHTTP.Вставить("Content-Type: ", "application/json-rpc");
HTTPЗапрос = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовокЗапросаHTTP);
СтрокаJSON = "{""jsonrpc"":""2.0"",""method"":""user.login"",""params"":{""user"":""zab"",""password"":""cDx;752(gW""},""id"":1,""auth"":null}";

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON,,);
ФайлРезультат = ПолучитьИмяВременногоФайла();
HTTP.ОтправитьДляОбработки(HTTPЗапрос,ФайлРезультат);
ТекстовыйФайлОтвета = Новый ТекстовыйДокумент;
ТекстовыйФайлОтвета.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);
СтрокаОтветаСервера = ТекстовыйФайлОтвета.ПолучитьТекст();    
Сообщить(СтрокаОтветаСервера);

Приходит пустой ответ от сервера. Если убрать значение АдресСтраницыНаСервере - то ответ прийдет с формой аутентификации (т.е. код отправляется и ответ приходит).
   Ёпрст
 
1 - 17.06.20 - 23:46
(0)
АдресСтраницыНаСервере = "/api_jsonrpc.php";
   Ёпрст
 
2 - 17.06.20 - 23:50
ну и для ответа, достаточно так писать

HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
Сообщить(HTTPОтвет.КодСостояния = 201);
Сообщить(HTTPОтвет .ПолучитьТелоКакСтроку());

т.е файло не нужно
   craxx
 
3 - 18.06.20 - 02:39
(2) может ему в файло логировать нужно все что с сервера прилетает
   hoffman064
 
4 - 18.06.20 - 06:40
(1) Попробовал и так и так не помогает.
(3) В ответ пустота HTTPОтвет.КодСостояния = 412
   Ёпрст
 
5 - 18.06.20 - 06:55
(4) заголовок проверяй
   Ёпрст
 
6 - 18.06.20 - 07:11
Ну и..а точно, что сервер приёмник именно zabbix.ru , а не какой нить вася.com ?
   hoffman064
 
7 - 18.06.20 - 07:15
(6) там внутренний ресурс, я его адрес указываю, если в браузере открыть открывается страница авторизации все норм.  
Если смотреть HTTPОтвет.Загаловки то там следующая картина :
Ключ    Значение
"Date"    "Thu, 18 Jun 2020 04:11:52 GMT"
"Server"    "Apache/2.4.6 (CentOS) PHP/5.4.45"
"X-Powered-By"    "PHP/5.4.45"
"Access-Control-Allow-Origin"    "*"
"Access-Control-Allow-Headers"    "Content-Type"
"Access-Control-Allow-Methods"    "POST"
"Access-Control-Max-Age"    "1000"
"Content-Length"    "0"
"Connection"    "close"
"Content-Type"    "text/html; charset=UTF-8"


https://www.zabbix.com/documentation/4.4/ru/manual/api
Пишут что "Запрос должен иметь заголовок Content-Type, который задан одним из следующих значений: application/json-rpc, application/json или application/jsonrequest."

В коде я указал 
ЗаголовокЗапросаHTTP.Вставить("Content-Type: ", "application/json-rpc");
   Ёпрст
 
8 - 18.06.20 - 07:22
(7) точно к заббикс.ру должен быть запрос, а не к твоему сайту?
   Ёпрст
 
9 - 18.06.20 - 07:23
Через курл хоть запоос проходит?
   hoffman064
 
10 - 18.06.20 - 10:47
(8) Точно в примере адрес логин и пароль изменен осознанно.

(9) curl -i -H "Content-Type:application/json-rpc" -X GET http://zabbix.ru/zabbix/api_jsonrpc.php -d '{"jsonrpc":"2.0","method":"user.login","params":{"user":"zabbix","password":"687"},"id":1,"auth":null}'  

Возвращает:
HTTP/1.1 200 OK
Date: Thu, 18 Jun 2020 07:42:58 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.45
X-Powered-By: PHP/5.4.45
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST
Access-Control-Max-Age: 1000
Content-Length: 159
Content-Type: application/json

{"jsonrpc":"2.0","error":{"code":-32700,"message":"Parse error","data":"Invalid JSON. An error occurred on the server while parsing the JSON text."},"id":null}

При этом подобный запрос через повершел:
$body = '{"jsonrpc":"2.0","method":"user.login","params":{"user":"zabbix","password":"687"},"id":1,"auth":null}'
$a = Invoke-RestMethod "http://zabbix.ru/zabbix/api_jsonrpc.php"; -ContentType "application/json-rpc" -Body $Body -Method Post
if ($a.result) {$a.result} else {$a.error}

Возвращает то что нужно.

echo '{"jsonrpc":"2.0","method":"user.login","params":{"user":"admin","password":"zabbix"},"id":1}'
Возвращает '{"jsonrpc":"2.0","method":"user.login","params":{"user":"admin","password":"zabbix"},"id":1}'
echo "Content-Type:application/json"
Возвращает  "Content-Type:application/json"

Возможно проблема в том что не отсекаются ковычки, хотя как их отсечь все равно не понятно.
   hoffman064
 
11 - 18.06.20 - 11:20
curl.exe -X POST -H "Content-Type:application/json-rpc" -d "{\"jsonrpc\": \"2.0\",\"method\":\"user.login\",\"params\":{\"user\":\"zabbix\",\"password\":\"687\"},\"id\":1}" http://zabbix.ru/zabbix/api_jsonrpc.php

Отработал нормально, перенес запрос в 1с эффекта нет.
   hoffman064
 
12 - 18.06.20 - 12:00
(8) Разобрался, проблема была в заголовке как вы и предполагали. Прилагаю рабочий код:


&НаКлиенте
Процедура ВыполнитьЗапрос3(Команда)
СерверПриемник = "zabbix.ru";
АдресСтраницыНаСервере = "/zabbix/api_jsonrpc.php";
Таймаут = 120;
HTTP = Новый HTTPСоединение(СерверПриемник,,,,,Таймаут,,);
//ЗаголовокЗапросаHTTP = Новый Соответствие();

//ЗаголовокЗапросаHTTP.Вставить("Content-Type:", "application/json");
//HTTPЗапрос = Новый HTTPЗапрос(АдресСтраницыНаСервере, ЗаголовокЗапросаHTTP);

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

СтрокаJSON = "{""jsonrpc"": ""2.0"",""method"": ""user.login"",""params"": {""user"": ""zabbix"",""password"":""687""},""id"": 0}";

HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON,КодировкаТекста.UTF8,ИспользованиеByteOrderMark.НеИспользовать);

//Если файлом

//ФайлРезультат = ПолучитьИмяВременногоФайла();
//HTTP.ОтправитьДляОбработки(HTTPЗапрос,ФайлРезультат);

//ТекстовыйФайлОтвета = Новый ТекстовыйДокумент;
//ТекстовыйФайлОтвета.Прочитать(ФайлРезультат, КодировкаТекста.UTF8);

//СтрокаОтветаСервера = ТекстовыйФайлОтвета.ПолучитьТекст();    
//Сообщить(СтрокаОтветаСервера);

//Сообщить(СтрокаJSON);

HTTPОтвет = HTTP.ОтправитьДляОбработки(HTTPЗапрос);
Сообщить(HTTPОтвет.КодСостояния);
Сообщить(HTTPОтвет .ПолучитьТелоКакСтроку());

КонецПроцедуры

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.