Имя: Пароль:
1C
1С v8
Отправка JSON-строк HTTP запросом в обычных формах
,
0 Saari
 
07.12.22
13:27
Отправляю JSON-строку HTTP запросом.
На управляемых формах все проходит успешно, а в обчных формах приходит ответ: unknown_request
Вот код отправления:
HTTPСоединение = Новый HTTPСоединение(Сервер);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJS);
Результат = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

Почему в обычных формах результат отрицательный, а в УФ все хорошо?
Помогите, пожалуйста, разобраться.
1 Ryzeman
 
07.12.22
13:31
Ну, как минимум у тебя одно может выполняться на клиенте, другое на сервере. Отладчиком смотрел - параметры запроса и строка идентичны?
+ код ответа HTTP какой? Сам запрос проходит?
2 Saari
 
07.12.22
13:39
(1) на УФ функция выполняется на сервере. В обычных формах я не указываю где выполняться функции.
Отладчиком проходил на обоих формах: сама строка JSON одинаково сформирована.
Результат.КодСостояния = 200
Как понять, что сам запрос проходит?
Далее код такой:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
Пока ЧтениеJson.Прочитать() Цикл
КонецЦикла;
И в этом цикле у JSON есть параметр result, значение которого на УФ - все нормально, а на обычных формах - error.
3 mikecool
 
07.12.22
13:39
если ответ - это ответ хттп-сервера, то все равно на какой стороне выполнять - неверный запрос
4 Saari
 
07.12.22
13:41
(3) в чем состоит запрос? JSON строка на УФ и в обычных формах на вид одинакова. Алгоритм формирования строки одинаков в обеих формах
5 Ryzeman
 
07.12.22
13:42
(2) Ты получаешь 200 код - это "успешно", значит запрос проходит. Похоже, разница где-то ещё. Проверь внимательно все переменные параметры запроса, тело, строку посимвольно. Может где то берёшь данные из реквизита или переменной которой на УФ не видно и там неопределено встаёт внезапно.
6 Kassern
 
07.12.22
13:42
(2) Если я все правильно понял, то на УФ, у вас запрос выполняется сервером под пользователем службы 1с и используются корневые сертификаты сервера. на ОФ - вы пытаетесь послать запрос под текущим пользователем системы с текущего компа используя его сертификаты.
Попробуйте &НаКлиенте запустить этот запрос на УФ. Такая же ошибка будет?
7 Saari
 
07.12.22
13:43
(5) думал про это. Проверю еще. Спасибо!
8 Kassern
 
07.12.22
13:44
(5) не заметил, что у него результат 200, тогда да, параметры не совпадают, либо тело запроса.
9 Ryzeman
 
07.12.22
13:44
(6) тоже вариант, но если при этом они 200-ый код возвращают, то они какие-то конченные)
10 Kassern
 
07.12.22
13:48
(2) Проблему это не решит, но для общего развития:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
Пока ЧтениеJson.Прочитать() Цикл
КонецЦикла;
Это дело можно удобно обойти штатными средствами:
ЧтениеJSON=Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьПоток(Ответ.ПолучитьТелоКакПоток());
Данные=ПрочитатьJSON(ЧтениеJSON);
11 Saari
 
07.12.22
13:52
(6) проверил. на УФ сделал все на клиенте, и все прошло успешно! Значит это не зависит от места вызова: на клиенте или на сервере.
12 Kassern
 
07.12.22
13:54
(11) Тогда проверяйте параметры, и ловите ваш запрос в Fiddler например.
13 Kassern
 
07.12.22
13:55
100% они будут отличаться (запрос с УФ и ОФ) раз у вас результат всегда разный.
14 Saari
 
07.12.22
13:58
(12) Извините за глупый вопрос, но... как поймать запрос в Fiddler?
15 Kassern
 
07.12.22
14:00
(14) Устанавливаете прогу фидлер и читаете инструкции, в инете их море)
https://habr.com/ru/post/533138/
16 Kassern
 
07.12.22
14:01
Ну либо любое другое приложение используйте, которое умеет перехватывать запросы
17 Saari
 
07.12.22
14:19
Изменил строку (как было см. выше):
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJS, КодировкаТекста.ANSI, ИспользованиеByteOrderMark.Авто);
И все получилось!
Спасибо вам всем!
18 Saari
 
07.12.22
14:20
А в УФ было так: HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJS);
19 ttk
 
07.12.22
15:35
(10) не в тему топика вопрос:
В каких случаях лучше использовать
ЧтениеJSON.ОткрытьПоток(Ответ.ПолучитьТелоКакПоток());
а в каких
ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());
?
20 Kassern
 
07.12.22
15:40
(19) как я понимаю УстановитьСтроку - это частный случай, позволяющий читать конкретную строку и работать с ней. ОткрытьПоток/Файл - это уже работа с целым файлом.
2 + 2 = 3.9999999999999999999999999999999...