Имя: Пароль:
1C
1С v8
Проблемы с информацией в теле HTTPЗапроса при выполнении метода "GET" HTTPСоединения
,
0 Григорополисец
 
06.03.23
16:37
Здравствуйте, уважаемые форумчане!

Сегодня, после переписки с техподдержкой одного из облачных сервисов для ресторанов, мне пришёл совет проверить тело HTTPЗапроса на предмет его заполненности. В тело HTTPЗапроса я передаю содержимое в виде строки с помощью метода .УстановитьТелоИзСтроки(ПолученныйДжсон, КодировкаТекста.UTF8).
Туда помещается фильтр по датам в формате JSON. В документации API говорится о необходимости использовать именно метод GET. В итоге, облачный сервер отвечает, код состояния 200. Информация в виде массива запрошенных документов (в данном случае акты списания продуктов) приходит, всё хорошо. Но в полученном массиве все документы, которые когда-либо созданы, а не за один нужный мне месяц. Боюсь, если запрашивать у них чеки продажи, то список будет более обширным. А забирать ресурсы сервера на лишнюю информацию не хочется вовсе.

Я уже и в виде двоичных данных пытался передавать, но итог тот же.
А вот как проверить, передаётся ли содержимое в теле запроса или нет, не знаю. В отладчике HTTPЗапрос и HTTPСоединение эти сведения не отображают.

Сами процедуры такие:

&НаСервере
Функция ф_ПолучитьОсновныеЗаголовкиЗапросаGET()
    
    ЗаголовкиЗапроса = Новый Соответствие;
    ЗаголовкиЗапроса.Вставить("Authorization", "Basic ХХХХХХХХХХХХХХХХХХХХХХХХХХ==");
    ЗаголовкиЗапроса.Вставить("Connection", "keep-alive");
    ЗаголовкиЗапроса.Вставить("Content-Type", "application/json");
    ЗаголовкиЗапроса.Вставить("Host", "hungrywolf.quickresto.ru");
    
    Возврат ЗаголовкиЗапроса;
    
КонецФункции

&НаСервере
Функция ф_ПолучитьПараметрыВТелеЗапросаJSON()
    ПериодыСоотв = Новый Соответствие;
    ПериодыСоотв.Вставить("since", Строка(Формат(НачалоДня(ЭтаФорма.ДатаНачала), "ДФ=гггг-ММ-дд" )) + "T00:00:00.000Z");
    ПериодыСоотв.Вставить("till", Строка(Формат(КонецДня(ЭтаФорма.ДатаОкончания), "ДФ=гггг-ММ-дд")) + "T23:59:59.999Z");
    
    ОтборыСоотв = Новый Соответствие;
    ОтборыСоотв.Вставить("field", "invoiceDate");
    ОтборыСоотв.Вставить("operation", "range");
    ОтборыСоотв.Вставить("value", ПериодыСоотв);
    
    МассивОтборов = Новый Массив;
    МассивОтборов.Добавить(ОтборыСоотв);
    
    ФильтрыСоотв = Новый Соответствие;
    ФильтрыСоотв.Вставить("filters", МассивОтборов);
    
    Фильтры = Новый ФиксированноеСоответствие(ФильтрыСоотв);

    Данные = Новый ЗаписьJSON();
    Данные.УстановитьСтроку();
    ЗаписатьJSON(Данные, Фильтры);
    
    Итог = Данные.Закрыть();
        
    Возврат Итог;

КонецФункции

&НаКлиенте
Процедура СодеинитьсяССерверомКлиент()
    
    Соедин1 = Новый HTTPСоединение("hungrywolf.quickresto.ru",443,,,,60, Новый ЗащищенноеСоединениеOpenSSL());
    ПолученныйДжсон = ф_ПолучитьПараметрыВТелеЗапросаJSON();
    
    ШаблонЗапроса = СтрШаблон("/platform/online/api/list?moduleName=%1", ЭтаФорма.КакойДокумент);
    
    ЗаголовкиЗапроса = ф_ПолучитьОсновныеЗаголовкиЗапросаGET();
    Запрос1 = Новый HTTPЗапрос(ШаблонЗапроса, ЗаголовкиЗапроса);
    Запрос1.УстановитьТелоИзСтроки(ПолученныйДжсон, КодировкаТекста.UTF8);

    Попытка
        Ответ = Соедин1.ВызватьHTTPМетод("GET", Запрос1);    
        
        Если Ответ.КодСостояния = 200 Тогда
            ЧтенДЖСОН = Новый ЧтениеJSON;
            ЧтенДЖСОН.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
            ОтветСоотв = ПрочитатьJSON(ЧтенДЖСОН, Истина);
            ЧтенДЖСОН.Закрыть();
        Иначе
            Сообщить("Код состояния ответа: " + Ответ.КодСостояния + Символы.ПС + "Причина: " + Ответ.ПолучитьТелоКакСтроку());
        КонецЕсли;
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры
1 Garykom
 
гуру
06.03.23
16:51
(0) Как в get-запрос засунуть тело?
"Пиши в 1С чтобы платформу исправили под современный RFC который допускает тело у GET."
2 Garykom
 
гуру
06.03.23
16:51
HTTPСоединение (HTTPConnection)
ВызватьHTTPМетод (CallHTTPMethod)
Синтаксис:
ВызватьHTTPМетод(<HTTPМетод>, <HTTPЗапрос>, <ИмяВыходногоФайла>)
Параметры:
<HTTPМетод> (обязательный)
Тип: Строка.
Строка, содержащая имя HTTP-метода для запроса.
Согласно стандарту RFC7230, строка должна содержать только символы латинского алфавита и цифры и символы: "!","#", "$", "%", "", "'", "*", "+", "-", ".", "^", "_", "`", "|", "~". Использование других символов не допускается.
<HTTPЗапрос> (обязательный)
Тип: HTTPЗапрос.
Запрос, передаваемый на сервер.
<ИмяВыходногоФайла> (необязательный)
Тип: Строка.
Имя файла, в который записывается тело ответа. Если не задано, то тело ответа может быть получено из объекта HTTPОтвет.
Значение по умолчанию: Пустая строка.
Возвращаемое значение:
Тип: HTTPОтвет.
Если задан параметр <ИмяВыходногоФайла>, то тело ответа будет записано в файл. В противном случае, тело ответа можно получить методами ПолучитьТелоКакСтроку и ПолучитьТелоКакДвоичныеДанные объекта HTTPОтвет.
Описание:
Отправляет данные на указанный адрес для обработки с использованием указанного HTTP-метода.
Доступность:
Сервер, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
При использоватения метода GET тело запроса на сервер отправлено не будет.
При использовании мобильной платформы на устройствах под управлением ОС Android версий 2.3 - 4.4 вызов данного метода с параметром PATCH недоступен и приведет к исключению.
Использование в версии:
Доступен, начиная с версии 8.3.6.
Описание изменено в версии 8.3.21.
     Методическая информация
3 Garykom
 
гуру
06.03.23
16:51
Примечание:
При использоватения метода GET тело запроса на сервер отправлено не будет.
4 Garykom
 
гуру
06.03.23
16:53
ЗЫ Походу в 1С все хуже и хуже "использоватения"

ЗЗЫ Современные типовые по кол-ву ошибок это какой то ахтунг
5 magicSan
 
06.03.23
17:18
(1) недавно былоотправлял гет с телом и оно возвращало - заметил не сразу. Это называется современное? Помоему эта дажа
6 Fragster
 
гуру
06.03.23
17:23
(0) на стороне апи сидят велосипедостроители. метод гет _по стандарту_ не предполагает тела запроса.
7 Fragster
 
гуру
06.03.23
17:23
причем не только 1с себя так ведет
8 magicSan
 
06.03.23
17:25
(7)еще раз 1с вернет, результат с телом от гет - платформу завтар напишу
9 Fragster
 
гуру
06.03.23
17:25
(1) и что же за номер у того более лучшего RFC?
10 Григорополисец
 
06.03.23
18:29
Как водится, дело было в методе GET. Попробовал POST вопреки их документации и всё сработало.
Проблема решена.
Благодарю всех!!!
11 magicSan
 
06.03.23
18:35
"    Запрос1.УстановитьТелоИзСтроки(ПолученныйДжсон, КодировкаТекста.UTF8);

    Попытка
        Ответ = Соедин1.ВызватьHTTPМетод("GET", Запрос1);    "   - "дело было не в бабине ......"

тем не менее 1ска отрабатывает гет в запросе в методе .получить() - возможно косяк платформы.
12 Григорополисец
 
06.03.23
19:02
(11) только что попробовал метод .Получить(Запрос1)
Не помогает. Платформа старенькая 3.0.64.54 - приблизительно 2017 года. Используется исключительно в управленческих целях.
в любом случае благодарю за совет!
13 rudnitskij
 
06.03.23
19:11
(12) платформа 3.0?
14 Garykom
 
гуру
06.03.23
19:39
(6) Покажи стандарт?
15 Garykom
 
гуру
06.03.23
19:43
(9) The RFC2616 referenced as "HTTP/1.1 spec" is now obsolete. In 2014 it was replaced by RFCs 7230-7237. Quote "the message-body SHOULD be ignored when handling the request" has been deleted.
https://stackoverflow.com/questions/978061/http-get-with-request-body
16 magicSan
 
06.03.23
19:46
(12) и не должен написано же ПОЛУЧИТЬ