Имя: Пароль:
1C
1С v8
Как в заголовке POST запроса передать параметр Date?
0 vova1122
 
21.11.21
21:07
Тестирую POST запрос. Для этого сделал внешнюю обработку. В тексте отправляю некую тестовую информацию и смотрю что мне возвращает 1С.
Все что нужно возвращает верно кроме даты в заголовке (дата возвращается не Текущая, а по Гринвичу)
    
        Сообщение = Новый СообщениеПользователю;
    
    Сервер = "localhost";
    
    Попытка
        
        Соединение = Новый HTTPСоединение(Сервер);
        
    Исключение
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
        Возврат;
    КонецПопытки;
    
    АдресРесурса = "/test/hs/test/";
    Заголовки = Новый Соответствие;
    
    Заголовки.Вставить("Content-Type", "application/json;charset=UTF-8");
    
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, Заголовки);
    
    СтрокаНоменклатураJSON = ПолучитьJSONСтрокуНоменклатуры();
    
    HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаНоменклатураJSON,"UTF-8");
    
    Попытка
        //ОТПРАВЛЯЕМ ДАННЫЕ НА СЕРВЕР
        Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
        
    Исключение
        Сообщение.Текст = ОписаниеОшибки();
        Сообщение.Сообщить();
        Возврат;
    КонецПопытки;
    Сообщить(Ответ.ПолучитьТелоКакСтроку());
    Сообщить(Ответ.КодСостояния);
    Соотв=Ответ.Заголовки;
    Для Каждого Элемент Из Соотв Цикл
        // тут проверяю что мне вернулось в заголовках
        Сообщить(Строка(Элемент.Ключ) + " ------ " + Элемент.Значение);
    КонецЦикла;


//======================================================================================================================
//тут в HTTPсервисах пишу код POST запроса

    Структура = Новый Структура;
    Структура.Вставить("tekstvozvrata",ТекстВозврата);
    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, Структура);
    Результат=ЗаписьJSON.Закрыть();        
    
    ДатаВозврат=XMLСтрока(ТекущаяДата()+750);
    //ДатаВозврат=ТекущаяДата();
    //ДатаВозврат=КодироватьСтроку(XMLСтрока(ТекущаяДата()+1120),СпособКодированияСтроки.КодировкаURL);
    // пробовал разные варианты которые удалось найти
    Заголовки = Новый Соответствие;
    Заголовки.Вставить("Content-Type","application/json; charset=utf-8");
    Заголовки.Вставить("Date",ДатаВозврат);  // вставил дату в заголовок
    
    
    Ответ = Новый HTTPСервисОтвет(200,,Заголовки);
    
    Ответ.УстановитьТелоИзСтроки(Результат);
    Возврат Ответ;



Но дата в любом случае получается не Текущая, а со смещением (в смысле дата возвращается по Гринвичу. Тоисть моя дата игнорируется)
Может кто подскажит как передать эту дату в заголовке post запроса?
1 vova1122
 
21.11.21
21:14
Такое ощущение что параметер Дата в заголовке вообще игнорируется
2 Ёпрст
 
21.11.21
21:14
(0)
МестноеВремя(<УниверсальноеВремя>, <ЧасовойПояс>)
3 vova1122
 
21.11.21
21:15
(2) куда это влепить?
4 Ёпрст
 
21.11.21
21:15
(3) там где нужна дата в местном времени
5 acht
 
21.11.21
21:18
(0) > ДатаВозврат=XMLСтрока(ТекущаяДата()+750);
...
> дата в любом случае получается не Текущая, а со смещением

Да неужели?
6 acht
 
21.11.21
21:21
А если ты внимательно посмотришь на строку даты, то увидишь там в конце свой часовой пояс.
7 vova1122
 
21.11.21
21:23
Вот так возвращает
Date ------ Sun, 21 Nov 2021 18:21:51 GMT
Server ------ Apache/2.4.34 (Win32)
Content-Length ------ 51
Content-Type ------ application/json; charset=utf-8
8 acht
 
21.11.21
21:25
(7) >  Sun, 21 Nov 2021 18:21:51 GMT
Это у тебя результат вызова XMLСтрока такой? Ну-ну.
9 vova1122
 
21.11.21
21:28
(8) Это возврат от Сервера
      Соотв=Ответ.Заголовки;
    Для Каждого Элемент Из Соотв Цикл
        // тут проверяю что мне вернулось в заголовках
        Сообщить(Строка(Элемент.Ключ) + " ------ " + Элемент.Значение);
    КонецЦикла;
10 Ёпрст
 
21.11.21
21:32
(7) ответ в json-е приходит ?
11 vova1122
 
21.11.21
21:32
Проверил XMLСтрока(ТекущаяДата()+750);  возвращает правильную дату (Текущая (местная) плюс моя добавка)
12 vova1122
 
21.11.21
21:33
(10) Нет. это какраз заголовки
13 vova1122
 
21.11.21
21:33
+(10) а тело , да в Джейсоне
14 acht
 
21.11.21
21:34
(9) А это потому, что сервер срать хотел на твой заголовок со служебным именем Date и всегда перебивает его своим с нужным ему значением.

https://datatracker.ietf.org/doc/html/rfc7231#section-7.1.1.2

"the sender SHOULD generate its field value as the best available approximation of the date and time of message generation."
15 acht
 
21.11.21
21:36
... An origin server MAY send a Date header field if the response is in the 1xx (Informational) or 5xx (Server Error) class of status codes.  An origin server MUST send a Date header field in all other cases.
16 acht
 
21.11.21
21:38
17 vova1122
 
21.11.21
21:38
(15) Так я ему писал ТекущаяДата() Всеравно игнорирует
18 vova1122
 
21.11.21
21:39
(16) так получается дату в заголовке не передать?
19 acht
 
21.11.21
21:40
(17) Еще раз. Заголовок с именем "Date" является служебным. Поэтому Apache выбрасывает наъ все что ты туда пытаешся засунуть и ставит, согласно стандарту, время создания сообщения в нужном формате.
20 acht
 
21.11.21
21:40
(18) В заголовке с другим именем - запросто
21 vova1122
 
21.11.21
21:42
(20) вот же "редиска", а я целый день потратил на эту муть
22 vova1122
 
21.11.21
22:29
еще нашел такой совет что нужно поменять в файле php.ini часовой пояс.

Пример:
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Europe/Berlin


У меня на сервере эта строка пустая и закоментироваана
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =

А на тестовом компе где я тестирую этого файла вообще нет. На сервере и на тестовом компе дату возвращает неверную.
Рискнуть поменять на сервере этот параметр? или могут быть проблемы?
23 Сергиус
 
21.11.21
22:47
(0)Вопрос, а собственно для чего тебе нужен этот заголовок?
24 vova1122
 
21.11.21
22:52
(23) принимающая сторона (сервер онлайн платежей) требует в заголовке передавать текущую дату
25 eklmn
 
гуру
22.11.21
09:46
(24) и у тебя сервер, конечно же настроен, как у них, все параметры те же?
тестируй у них на сервере, попроси пример
26 acht
 
22.11.21
10:02
(24) Чем не устраивает дата, которую передает apache?
27 Сергиус
 
22.11.21
10:06
(24)[дата возвращается не Текущая, а по Гринвичу]

Судя по тому, что ты пишешь, какая то дата точно есть. Почему ты решил, что проблема именно в этом?
28 acht
 
22.11.21
10:13
(24) FYI: https://datatracker.ietf.org/doc/html/rfc2616#section-3.3.1

All HTTP date/time stamps MUST be represented in Greenwich Mean Time (GMT), without exception.
29 eklmn
 
гуру
22.11.21
10:17
(26)(27) он в принципе не с той стороны смотрит на вопрос
30 vova1122
 
22.11.21
11:09
У них есть страница для теста запросов
Вот что она возвращает

Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Length: 62
Content-Type: text/json; charset=utf-8
Date: Mon, 22 Nov 2021 08:05:49 GMT
Server: Apache/2.4.34 (Win32)

И отдельно красным пишет
Data at the root level is invalid. Line 1, position 1.
31 acht
 
22.11.21
11:11
(30) "Data" - это "данные", а не "дата", турист.
32 acht
 
22.11.21
11:11
У тебя тело запроса кривое
33 vova1122
 
22.11.21
11:12
(32) Спасибо, а то я Читаю Data и понимаю  Дата
34 acht
 
22.11.21
11:15
(33) Удачи тебе и семь футов под килем