|
Проблемы с информацией в теле 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) и не должен написано же ПОЛУЧИТЬ
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |