Python Requests разбивает TCP-пакет - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь создать сценарий HTTP POST-запроса с python.

При попытке с помощью curl из bash все работает.В python, используя библиотеку requests или urllib3, я получаю сообщение об ошибке от API.Запрос POST содержит информацию в заголовках и в виде json в теле запроса.

Что я заметил, когда я перехватываю пакеты с помощью Wireshark, запрос curl (который работает) представляет собой один отдельный пакет длиной 374 байта,Python-запрос (без разницы между requests и urllib3 здесь) разбивается на 2 отдельных пакета длиной 253 и 144 байта.

enter image description here

Wireshark собирает их без проблем, и они оба, кажется, содержат полную информацию в заголовке и теле POST.Но API, к которому я пытаюсь подключиться, отвечает не очень полезной «Ошибка при обработке запроса».

Поскольку 253 байта не могут быть пределом TCP-пакета, в чем причинаповедение?Есть ли способ исправить это?

РЕДАКТИРОВАТЬ:

bash:

curl 'http://localhost/test.php' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' -H 'Content-Type: application/json' -d '{"key1":"value1","key2":"value2","key3":"value3"}'

python:

import requests, json

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
"Content-Type": "application/json"}

data = {"key1":"value1", "key2":"value2", "key3":"value3"}

r=requests.post("http://localhost/test.php", headers=headers, data=json.dumps(data))

1 Ответ

0 голосов
/ 07 мая 2018

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

Хотя я видел такие неработающие системы, я видел больше систем, которым не нравится запрос по разным причинам, например, неправильный пользовательский агент, отсутствующий заголовок accept или аналогичный. Я бы посоветовал вам сначала проверить это, прежде чем заключить, что это должна быть сегментация потока данных.

Что касается того, почему curl и запросы ведут себя по-разному: вероятно, curl сначала создает полный запрос (заголовок и тело) и отправляет его, в то время как запросы создают сначала заголовок и отправляют его, а затем отправляют тело, то есть выполняет две операции записи, которые могут привести к в двух пакетах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...