Отправить данные через запрос POST - PullRequest
0 голосов
/ 09 мая 2018

Некоторое время назад я использовал сокеты с Python, и я пытаюсь понять, почему не работает этот POST, который должен отправлять некоторые данные в поля data1 и data2.

POST /method.php HTTP/1.1\r\nHost: localhost\r\nContent-Type: multipart/form-data\r\n\r\ndata1=something&data2= otherthing\r\n\r\n

В чем проблема с этим запросом?

Ответы [ 3 ]

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

Возможно, проще использовать библиотеку запросов , чтобы ваш код выглядел примерно так:

import requests

# Data
data = {
    'data1':'something', 
    'data2':'otherthing'
}

# Custom headers
headers = {
    'content-type': 'multipart/form-data'
}

# Get response from server
response = requests.post('http://localhost/', data=data, headers=headers)

# If you care about the response
print(response.json())

Вы также можете отправлять файлы и множество других вещей

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

В вашем запросе есть несколько ошибок:

 POST /method.php HTTP/1.1
 Host: localhost
 Content-Type: multipart/form-data

 data1=something&data2= otherthing

Во-первых, всякий раз, когда тело используется в HTTP-запросе, длина тела должна быть известна. Обычно это делается с учетом длины впереди с Content-length в заголовке HTTP, хотя также может использоваться фрагментное кодирование, если полная длина не известна заранее. Ваш запрос не выполняет ничего из этого, что означает, что запрос является недействительным HTTP-запросом.

Кроме того, вы претендуете на Content-Type из multipart/form-data, хотя ваше тело не относится к этому типу. С multipart/form-data ваше тело будет состоять из нескольких частей MIME, разделенных текстовой границей, и эта граница должна быть объявлена ​​в заголовке Content-type. Правильный тип для тела, которое вы показываете, будет вместо application/x-www-form-urlencoded.

Даже с application/x-www-form-urlencoded тело частично не в порядке. Тело этого типа должно состоять только из пар key=value, соединенных &, т. Е. После ключа не должно быть места, такого же, как после data2=, и не должно быть добавлено новых строк после конца данных, как вы есть.

При устранении всех этих проблем вам, вероятно, следует отправить следующий запрос:

body = "data1=something&data2=otherthing"
request = ("POST /method.php HTTP/1.1\r\n" + \
    "Host: localhost\r\n" + \
    "Content-Type: application/x-www-form-urlencoded\r\n" + \
    "Content-Length: %d\r\n" + \
    "\r\n%s") % (len(body),body)

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

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

Вы пробовали использовать библиотеку Requests вместо примера запроса ниже

import requests
header = {"Content-Type": "multipart/form-data"}
data1="something"
data2= "otherthing"

session_requests = requests.session()
result = session_requests.post("http://localhost/", data=dict(data1, data2), headers=header)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...