400 Bad Request при публикации данных JSON на странице PHP с использованием сокета - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь написать программу, которая считывает значения температуры и влажности с устройства Pysense и сохраняет эти значения в базе данных, которая находится на моем ноутбуке.Для этого я использую сокет для отправки данных Json через POST на страницу php, которая затем декодирует данные Json и вставляет соответствующие значения в базу данных.У меня проблема в том, что я получаю ответ «400 неверных запросов» при попытке отправить данные на страницу php.Я предполагаю, что это как-то связано с форматированием моих данных Json, но я не могу найти какое-либо решение в Интернете, которое мне подходит.Вот мой код ниже:

Здесь значения hum и temp - это показания устройства.

data = '{ "DeviceName": 1, "Humidity": %.2f, "Temperature": %.2f }'%(hum,temp)

header = ("""
POST /insert.php HTTP/1.1
Host: 192.168.4.2
Content-Type: application/json\r\n
""")

contentLengthStr = 'Content-Length : %s\r\n\r\n'%str(len(data))
request = header + contentLengthStr + data
print(request)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send(request.encode())
response = s.recv(4096)
print(response)

Я ожидаю, что данные будут декодированы страницей php, но здесьэто ответ, который я получаю из консоли:

HTTP / 1.1 400 неверный запрос \ r \ nДата: вторник, 29 января 2019 16:12:06 GMT \ r \ nСервер: Apache / 2.4.33 (Win32) OpenSSL / 1.1.0h PHP / 7.2.6 \ r \ nВары: accept-language, accept-charset \ r \ nAccept-Ranges: байты \ r \ nСоединение: закрыть \ r \ nContent-Type: text / html;charset = utf-8 \ r \ nContent-Language: en \ r \ nExpires: вт, 29 января 2019 16:12:06 GMT \ r \ n \ r \ n \ r \ n \ r \ n \ r \ n \r \ nПлохой запрос! \ r \ n \ r \ n * / -> \ r \ n \ r \ n \ r \ n \ r \ nПлохой запрос! '

Любые предложения будут оценены!

1 Ответ

0 голосов
/ 29 января 2019
header = ("""
POST /insert.php HTTP/1.1
Host: 192.168.4.2
Content-Type: application/json\r\n
""")

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


POST /insert.php HTTP/1.1
Host: 192.168.4.2
Content-Type: application/json

Content-Length : 59

{ "DeviceName": 1, ... }

Дополнительная пустая строка между Content-Type и Content-Length является проблемой.Может быть и в начале, но я не уверен в этом.

Использование библиотеки, такой как requests, предотвратит такую ​​глупую ошибку.

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