Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Http севрис - исключение платформы на ответ с кодом 422

Http севрис - исключение платформы на ответ с кодом 422
Я
   Daniilvb
 
28.09.20 - 12:39
Всем доброго дня!
Столкнулся с непонятным поведением http сервиса. Для теста создал запрос get с простым обработчиком:
Функция testget(Запрос)
    
  Ответ = Новый HTTPСервисОтвет(422);

  Возврат Ответ;
    
КонецФункции

В файловом варианте получаю корректный пустой ответ с кодом 422. А в серверном (mssql и posgres) исключение платформы с кодом 400
и ошибкой 1С:Enterprise 8 application error: Некорректные символы в заголовке http.

Если код изменить на Ответ = Новый HTTPСервисОтвет(400), то работает корректно и в файловом, и серверном варианте.
Кто-нибудь сталкивался с таким поведением?
   Daniilvb
 
1 - 28.09.20 - 12:56
Поведение одинаковое на Apache 2.4 и IIS 10.0. Платформа 8.3.17.1549.
   Daniilvb
 
2 - 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>

Может кто-то даст направление, в котором следует копать )
   Asmody
 
3 - 28.09.20 - 23:25
422 это для webdav. думаю, что платформа хочет каких-то заголовков соответствующих
   Daniilvb
 
4 - 29.09.20 - 08:47
(3) Непонятно, почему тогда в файловом варианте всё работает.
   trad
 
5 - 29.09.20 - 09:37
(4) версии платформы одинаковые в файловом и серверном варианте?
   Daniilvb
 
6 - 29.09.20 - 10:05
(5) Да, версии одинаковые. Еще была попытка на какой-то 8.3.16, но результат отрицательный.
   Daniilvb
 
7 - 29.09.20 - 10:07
Думаю уже над костылем, может кто подскажет элегантное решение? Отдавать в сервисе 1С код 400, а на Apache(возможно, скриптом php) подменять код на 422.
   Garykom
 
8 - 29.09.20 - 10:08
Ответ.Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
   Daniilvb
 
9 - 29.09.20 - 10:08
Проблема еще в том, что в теле есть информация, которую нужно сохранить. А изменить только код ответа с 400 на 422.
   Garykom
 
10 - 29.09.20 - 10:09
(8)+ В смысле установи заголовки и тело ответа
   Garykom
 
11 - 29.09.20 - 10:09
Функция testget(Запрос)
    
  Ответ = Новый HTTPСервисОтвет(422);
  Ответ.Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
  //...

  Возврат Ответ;
    
КонецФункции
   trad
 
12 - 29.09.20 - 10:11
(11) я пробовал. это не помогает
   Daniilvb
 
13 - 29.09.20 - 10:11
(8) В сообщении привел урезанный вариант, на котором воспроизводится проблема. В рабочем варианте было так:
    
Ответ.Заголовки.Вставить("Content-type", "application/json");
Ответ.Заголовки.Вставить("Charset", "utf-8");
   Garykom
 
14 - 29.09.20 - 10:13
(13) тело покажи в hex
   Daniilvb
 
15 - 29.09.20 - 10:18
(14) Так проблема даже с пустым телом и любыми заголовками. Сейчас посмотрю, как в hex перегнать.
   trad
 
16 - 29.09.20 - 10:20
в доке к HTTPСервисОтвет сказано:
"Причина (Reason)
Содержит текстовую расшифровку кода HTTP-статуса.
Для стандартных статусов в ответе формируется автоматически."


Следовательно для всякой экзотики причину надо задавать самому.
В общем так работает:
Ответ = Новый HTTPСервисОтвет(422, "Unprocessable Entity");
Возврат Ответ;
   Garykom
 
17 - 29.09.20 - 10:27
(16) Гы я понял.

>[ Content-Length: 8]

NULL * 2 (1C символы 2 байтами кодит) = ?
   Daniilvb
 
18 - 29.09.20 - 10:36
(16) Громаднейшее спасибо! Я в этом тупике просидел много часов! Но так и непонятно, почему в файловой и без этого работает.
   Garykom
 
19 - 29.09.20 - 11:03
(18) Вероятно файловая возвращает в веб-сервер пустую строку вместо Null

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.