Обработка данных формы -заголовки отправляются разные, это нормально?

Sly32
На сайте с 29.03.2012
Offline
303
181

Закопался тут в серверлесс технологии и столкнулся с неизвестным мне фактом. Так как я ни разу не системщик и да и с фронтендом имею мало дел, может кто подскажет, нормально ли это и можно ли как-то настроить.

Ситуация: Фронт написан на Реакте, данные формы отправляются на api gateway амазоновский а сам обработчик лежит в лямбде. Потестил код через Постман - все отлично, отправляю данные из формы - поломалось. Искал причину и наткнулся буквально случайно, что в хедерах заголовки в постмане идут с большой буквы а в браузере(Хром) с маленькой, соответственно нужный заголовок не находится и падает ошибка. Пришлось еще писать проверку на это, но как-то совсем костыльно. Это вообще нормальная ситуация?

Примеры заголовков, могу быть такие:

'content-type': 'multipart/form-data;...'
'Content-Type': 'multipart/form-data;...'

Может, другие браузеры еще какие заголовки шлют?

L
На сайте с 10.02.2015
Offline
221
#1
Sly32 :
Content-Type

В php заголовки клиента содержаться в массиве $_SERVER c ключами вида

CONTENT_TYPE

То есть ключи приводятся к верхнему регистру и разделителем стает нижнее подчеркивание

Я хз, это web сервер проводит такие манипуляции или сам php

Sly32
На сайте с 29.03.2012
Offline
303
#2
livetv #:

В php заголовки клиента содержаться в массиве $_SERVER c ключами вида

То есть ключи приводятся к верхнему регистру и разделителем стает нижнее подчеркивание

Я хз, это web сервер проводит такие манипуляции или сам php

Кстати навел на мысль хорошую, спасибо. Тут как раз у пхп есть преимущество как у языка, исключительно заточеного под веб, в пайтоне все это пришлось делать руками. Тут дело не в вебсервере а в том как данные формы отсылает браузер.

DD
На сайте с 16.05.2012
Offline
82
#3
Sly32 #:
Тут дело не в вебсервере а в том как данные формы отсылает браузер.

браузер всегда правильно отсылает стандартные заголовки.
вы как заголовки проверяете? (Django, Flask, что то еще используете)


Если джанго -

#  You can access headers case-insensitively
'Content-Type' in request.headers
# True
'content-type' in request.headers
# True

если фласк - (если не ошибаюсь - давно не использовал) также  возможно case insens

livetv #:

В php заголовки клиента содержаться в массиве $_SERVER c ключами вида

То есть ключи приводятся к верхнему регистру и разделителем стает нижнее подчеркивание

Я хз, это web сервер проводит такие манипуляции или сам php

Это ПХП делает. Вебсервер опирается на стандарты.

Разработка систем сбора данных на Python/Golang/NodeJs
Sly32
На сайте с 29.03.2012
Offline
303
#4
drDaemon #:
вы как заголовки проверяете? (Django, Flask, что то еще используете)

Я сейчас не использую фреймворки, на чистом пайтоне все. Потому что все делается под авсовскую лямбду. Сначала для тестов поднимал фласковский веб-сервер, потом набросал свой. НО тут дело не веб-сервере, он отрабатывает как надо. Это именно бразуер по разному шлет заголовки. Например Постман их отправляет в ловеркэйс, хром - аппер. 

Solmyr
На сайте с 10.09.2007
Offline
501
#5
По стандартам http заголовки регистронезависимы. Т.е. да, это нормальная ситуация.
T7
На сайте с 19.09.2018
Offline
63
#6
Sly32 #:
на чистом пайтоне все
(pyenv) [www@localhost ~]$ python
Python 3.9.0 (default, Nov 14 2020, 12:28:09)
[GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from multidict import CIMultiDict
>>> oo = CIMultiDict( {
...                      'conTent-tYPe':1,
...                      'Cache-Control':2
...                    } )
>>> oo['Content-TYPE']
1
Как вариант
Sly32
На сайте с 29.03.2012
Offline
303
#7
timo-71 #:
Как вариант

Спасибо, не знал что так можно, в принципе, решает мою проблему! Единственное - нужно импортить ее, соответственно создавать слой для лямбды, так хотел обойтись без этого. Но оно того стоит!

T7
На сайте с 19.09.2018
Offline
63
#8
Sly32 #:
не знал что так можно
Тоже не знал, подсмотрел у aiohttp
Server Reference — aiohttp 3.7.3 documentation
  • docs.aiohttp.org
The Request object contains all the information about an incoming HTTP request. is used for (which have no applications, routers, signals and middlewares). has an and attributes. class ¶ ¶ HTTP version of request, Read-only property. Returns instance. ¶ HTTP method , read-only property. The value is upper-cased like , , etc. ¶ A instance with...
Sly32
На сайте с 29.03.2012
Offline
303
#9
timo-71 #:
Тоже не знал, подсмотрел у aiohttp

Мне aiohttp очень зашел, но работал в нем в основном с бэкенд частью и больше гет-запросами. После него на джангу как-то неохота смотреть.

А сейчас вообще ушел в серверлесс - веселая штука, но настройка - то еще развлечение)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий