Имя: Пароль:
1C
1С v8
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