![]() |
![]() |
|
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Ответ .ПолучитьТелоКакСтроку()); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |