Имя: Пароль:
1C
1С v8
HTTP запрос из 1С
0 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Ответ .ПолучитьТелоКакСтроку());

т.е файло не нужно
3 craxx
 
18.06.20
02:39
(2) может ему в файло логировать нужно все что с сервера прилетает
4 hoffman064
 
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 ?
7 hoffman064
 
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
Через курл хоть запоос проходит?
10 hoffman064
 
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"

Возможно проблема в том что не отсекаются ковычки, хотя как их отсечь все равно не понятно.
11 hoffman064
 
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с эффекта нет.
12 hoffman064
 
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Ответ .ПолучитьТелоКакСтроку());

КонецПроцедуры
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс