Что делать если нужно отправить в api очень длинный запрос?

Предисловие = описание ошибки
Got more than 8190 bytes (25569123) when reading Status line is too long.

Делаю api, требуется принять большой объект json, обработать и вернуть. Но в попытке передать этот объект в api как следует из ошибки, мне сообщают что мой запрос слишком велик. Если честно я теряюсь и не понимаю что я могу сделать что бы осуществить задуманной либо пойти каким то приемлемым альтернативным путем.
api я построил на aiohttp. Я пробовал и другие фремйворки но в целом проблема та же, не говоря уж о сопутствующих проблемах других фреймворков....
П.С.: Прошу принять во внимание что я новичок... если уж окажется что я совсем какую то ерунду спрашиваю...

async def handle(request):
    data = json.loads(request.query['data'])
    brand = json.loads(request.query['brand'])
    ip = request.query['ip']
    final_data = launch_processors(brand, data)
    
    return web.Response(text=json.dumps(final_data, ensure_ascii=False))
  • Вопрос задан
  • 238 просмотров
Решения вопроса 2
firedragon
@firedragon
Senior .NET developer
Большие объемы данных лучше передавать через POST. Там ограничение на объем тела запроса несколько мегабайт (зависит от настроек, может быть до 2 гигабайт).
Ответ написан
leahch
@leahch
Я мастер на все руки, я козлик Элек Мэк :-)
1) проверьте, что сервер пропускает ваш запрос и в нем нет ограничения! Еьо если работаете через nginx например.
2) передавайте методом POST
3) в самом приложении может где сами лимиты какие поставили, бывает.
Если все настроено правильно, никаких ограничений быть не должно, летают запросы иногда по несколько гигабайт.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@bkosun
Для начала нужно посмотреть исходники:
class HeadersParser:
    def __init__(self,
                 max_line_size: int=8190,
                 max_headers: int=32768,
                 max_field_size: int=8190) -> None:
...


https://github.com/aio-libs/aiohttp/blob/5f0a59fd3...

class HttpParser(abc.ABC):

    def __init__(self, protocol: BaseProtocol,
                 loop: asyncio.AbstractEventLoop,
                 max_line_size: int=8190,
                 max_headers: int=32768,
                 max_field_size: int=8190,
...


https://github.com/aio-libs/aiohttp/blob/5f0a59fd3...
Ответ написан
@Alons Автор вопроса
Как итог что было...
Я передавал данные post но использовал по незнанию params = а должен был data=.
requests.post("http://localhost:8080/find", data=payload)

Это безусловно сходу увеличило объем проходимых данных но, но как оказалось по умолчанию все равно есть ограничитель.
Установлен он client_max_size=1024**2
Изменений до client_max_size=1024**8 вполне хватило для необходимого мне объема.
web.Application(client_max_size=1024**8)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы