![]() |
|
Http севрис - исключение платформы на ответ с кодом 422 | ☑ | ||
---|---|---|---|---|
0
Daniilvb
28.09.20
✎
12:39
|
Всем доброго дня!
Столкнулся с непонятным поведением http сервиса. Для теста создал запрос get с простым обработчиком: Функция testget(Запрос) Ответ = Новый HTTPСервисОтвет(422); Возврат Ответ; КонецФункции В файловом варианте получаю корректный пустой ответ с кодом 422. А в серверном (mssql и posgres) исключение платформы с кодом 400 и ошибкой 1С:Enterprise 8 application error: Некорректные символы в заголовке http. Если код изменить на Ответ = Новый HTTPСервисОтвет(400), то работает корректно и в файловом, и серверном варианте. Кто-нибудь сталкивался с таким поведением? |
|||
1
Daniilvb
28.09.20
✎
12:56
|
Поведение одинаковое на Apache 2.4 и IIS 10.0. Платформа 8.3.17.1549.
|
|||
2
Daniilvb
28.09.20
✎
22:55
|
По последним тестам: коды с 400 по 417 отрабатывают штатно, а с 418 по 499 все выдают одно исключение:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>1C:Enterprise 8 application error</title> </head> <body> <h2>1C:Enterprise 8 application error:</h2>Некорректные символы в заголовке HTTP: [ Content-Length: 8] </body> </html> Может кто-то даст направление, в котором следует копать ) |
|||
3
Asmody
28.09.20
✎
23:25
|
422 это для webdav. думаю, что платформа хочет каких-то заголовков соответствующих
|
|||
4
Daniilvb
29.09.20
✎
08:47
|
(3) Непонятно, почему тогда в файловом варианте всё работает.
|
|||
5
trad
29.09.20
✎
09:37
|
(4) версии платформы одинаковые в файловом и серверном варианте?
|
|||
6
Daniilvb
29.09.20
✎
10:05
|
(5) Да, версии одинаковые. Еще была попытка на какой-то 8.3.16, но результат отрицательный.
|
|||
7
Daniilvb
29.09.20
✎
10:07
|
Думаю уже над костылем, может кто подскажет элегантное решение? Отдавать в сервисе 1С код 400, а на Apache(возможно, скриптом php) подменять код на 422.
|
|||
8
Garykom
гуру
29.09.20
✎
10:08
|
Ответ.Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
|
|||
9
Daniilvb
29.09.20
✎
10:08
|
Проблема еще в том, что в теле есть информация, которую нужно сохранить. А изменить только код ответа с 400 на 422.
|
|||
10
Garykom
гуру
29.09.20
✎
10:09
|
(8)+ В смысле установи заголовки и тело ответа
|
|||
11
Garykom
гуру
29.09.20
✎
10:09
|
Функция testget(Запрос)
Ответ = Новый HTTPСервисОтвет(422); Ответ.Заголовки.Вставить("Content-Type","application/json; charset=utf-8"); //... Возврат Ответ; КонецФункции |
|||
12
trad
29.09.20
✎
10:11
|
(11) я пробовал. это не помогает
|
|||
13
Daniilvb
29.09.20
✎
10:11
|
(8) В сообщении привел урезанный вариант, на котором воспроизводится проблема. В рабочем варианте было так:
Ответ.Заголовки.Вставить("Content-type", "application/json"); Ответ.Заголовки.Вставить("Charset", "utf-8"); |
|||
14
Garykom
гуру
29.09.20
✎
10:13
|
(13) тело покажи в hex
|
|||
15
Daniilvb
29.09.20
✎
10:18
|
(14) Так проблема даже с пустым телом и любыми заголовками. Сейчас посмотрю, как в hex перегнать.
|
|||
16
trad
29.09.20
✎
10:20
|
в доке к HTTPСервисОтвет сказано:
"Причина (Reason) Содержит текстовую расшифровку кода HTTP-статуса. Для стандартных статусов в ответе формируется автоматически." Следовательно для всякой экзотики причину надо задавать самому. В общем так работает: Ответ = Новый HTTPСервисОтвет(422, "Unprocessable Entity"); Возврат Ответ; |
|||
17
Garykom
гуру
29.09.20
✎
10:27
|
(16) Гы я понял.
>[ Content-Length: 8] NULL * 2 (1C символы 2 байтами кодит) = ? |
|||
18
Daniilvb
29.09.20
✎
10:36
|
(16) Громаднейшее спасибо! Я в этом тупике просидел много часов! Но так и непонятно, почему в файловой и без этого работает.
|
|||
19
Garykom
гуру
29.09.20
✎
11:03
|
(18) Вероятно файловая возвращает в веб-сервер пустую строку вместо Null
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |