Отправка POST запроса от ардуино на web server
- Войдите на сайт для отправки комментариев
Втр, 13/02/2018 - 23:28
Привет! Ребят, нужна помощь с отправкой POST запроса, с отправкой GET сложностей не возникло, но POST запрос делается чуть по - другому, прошу помочь, как он должен выглядеть?
Вот, как выглядит рабочий get запрос, переделайте под post, пожалуйста. Отправка 2 переменных на сервак http://192.168.1.68:3000/
void sendData(float t, float h) {
client.connect(server, 80);
client.print( "GET http://192.168.1.68:3000/measurements");
client.print("t=");
client.print(t);
client.print("&");
client.print("h=");
client.print(h);
client.println(" HTTP/1.1");
client.print( "Host: " );
client.println(server);
client.println( "Connection: close" );
client.println();
client.println();
client.stop();
client.flush();
}
Почитать про формат запросов HTTP - не судьба? Уж если взялись за формирование запросов вручную - почитайте хотя бы основы. Первое - вместо GET для post-запроса надо написать POST. Второе - никаких http:// в строке URI после метода, только относительный адрес, в вашем случае /measurements. Третье - в заголовке Host - никаких http:// - там просто адрес хоста. Четвёртое - для POST-запроса данные запроса - идут после двух переводов строки, в теле запроса, в вашем случае - их надо писать сразу перед строчкой client.stop.
Но лучше всего - ознакомиться с HTTP, хотя бы рамочно.
Не хватает правильного заголовка Content-Type. Вы прочитаете про HTTP или так и будете выманивать по строчке? Подсказка - методы кодирования тела сообщения при отправке запроса POST - бывают разные. Ваш -
application/
x-www-form-urlencoded
Вангую, что следующим вопросом будет "почему данные неправильно воспринимаются сервером". Отвечу заранее: читать тут, как вариант - https://www.w3schools.com/tags/ref_urlencode.asp
Прочитал пару статей про post запросы, все равно не могу заставить работать, помогите!)
Что именно непонятно из написанного мной выше? Ок, задам вопрос по-другому: приведи мне пожалуйста текст POST-запроса, который ты считаешь правильным, и который надо послать на сервер. Не код для ардуины - а именно текст запроса, типа такого (\r\n - символизируют переводы строки):
То, что я привёл выше - валидный POST-запрос, за исключением неправильно рассчитанного Content-Length.
У меня вот так, нет \r\n\r\n, они все равно нужны, если у меня client.println?
POST /measurements HTTP/1.1
Host: 192.168.1.68:3000
content-type: application/x-www-form-urlencoded
Connection: close
t=10&h=20
У вас неправильный запрос. Во-первых, нет Content-Length. Во-вторых - нет двух переводов строки между последним заголовком и данными. В-третьих - вот тут есть пример, изучайте: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST
То, что я привёл выше - валидный POST-запрос, за исключением неправильно рассчитанного Content-Length.
Здравствуйте, подскажите кто-нибудь, а почему коннект закрывается до появления в запросе аргументов? Оо
Здравствуйте, подскажите кто-нибудь, а почему коннект закрывается до появления в запросе аргументов? Оо
а скетч есть? в котором закрывается коннект
Скетча нет, я процитировал пост гуру, который выше пмогал человеку.
Сам сейчас разбираюсь в этом вопросе, попал вот в руки ардуино, изучаю вопрос, так сказать.
У меня в скетче это сделано вот так:
И в принципе всё работает, test.php получает параметр "х"
Единственное что мне не понятно, почему-то $_POST['x'] получается текстовой переменной, echo выводить "111.11", когда я раньше баловался с PHP при передаче числовых значений на выходе я и получал числовые значения, а тут почему-то строка...
Получается перед дальнейшим использованием мне придётся её сначала в число как-то перегнать =\
Connection: close означает, что сервер после ответа на запрос закроет соединение, и не будет поддерживать его keep-alive.
В Host: можно писать не ip, а домен, на одном ip может быть много виртуальных хостов.
content-length: 8 означает 8 байт полезной нагрузки, включая "x=" - стало быть, после него на сервер должно уйти ещё 6 байт. "111.11" похожи на 6 байт.
меня 111.11 вполне устраивает, это как раз то что мне нужно, только оно на сервер не как число с двумя знаками после точки приходит а прям вот в таком виде => "111.11"
Это нормально?
Что отправляете - то и приходит, это вполне нормально.
Я отправляю х=111.11, а не х="111.11"
Как отправить число, чтобы получить число, подскажете ?)
UPD: Всё разобрался... у меня fill раньше формаитровался в строку дополненную всяким антуражем, я антураж убрал, а стринг на инт забыл поменять.
Я отправляю х=111.11, а не х="111.11"
нет, вы отправляете именно "111.11". Вы ползуетесь командой print. а она превращает ваше число 111.11 в строку "111.11"
Вообще на сервере получить из этого число не должно быть проблемой, например на Апаше сервер сам парсит парметры POST или GET запроса
Да, выше уже уточнил пост, что оказывается я отправляю стринг, а не инт, это раз.
А два, intval() помогло :)
У меня пхп на серверер к IIS прикручен.
Php всё равно, он получает из запроса байты, а не числа или строки, может представить их для echo, как строку. А уже как дальше интерпретировать полученные данные - это ваше дело, а не php.
>> IIS
Хозяин-барин, конечно :) ну, или может, египтянин :))
Спасибо за помощь, всё что пока хотел реализовать вышло.
Редко обращаюсь к программированию, по этому за время перерывов многое успеваю забыть, в плане операторов, приходится неистово гуглить )))
Php всё равно, он получает из запроса байты, а не числа или строки, может представить их для echo, как строку. А уже как дальше интерпретировать полученные данные - это ваше дело, а не php.
насколько я помню, в php динамические типы данных. то есть для него 111.11 и "111.11" - в принципе одно и тоже. Если с перлом не путаю...
Да, динамические. Начиная с 7, начали прикручивать и статическую типизацию (гыы :), и можно ещё раньше было начать ей пользоваться через phpdoc.
>> IIS
Хозяин-барин, конечно :) ну, или может, египтянин :))
Этож не продакшн... у меня 1С через web на рабочей машине крутится, что бы лишнего не ставить, раз уж 80 порт занят, прикрутил к IIS php, работает... так же и БД на MSSQL работает, пришлось драйвер от мелкомягких к php прицепить, кривожопая хрень какая-то sqlsrv_num_rows() только через задницу работает, наверное и всё остальное тоже... но мне надо пока только select да insert...
Макет одного порграммно технического комплекса ваяю, людям показать :)
В "Продакшн" потом всё по взрослому писаться будет... (наверное :D)
что используете для коннекта с сервером? Подавляющее большиство модемов из коробки "умеют" HTTP. FTP, SMTP/POP/IMAP и ещё много страшный слов )) Почитайте мануал к своему
Не знаю, не смотрел, библеотеку юзаю ESP8266WiFi.h
Метод WiFiConnect.
Всё остальное так же как при использовании Ethernet.h POST HTTP.... бла бла бла )
На narodmon.ru так делал:
День добрый господа, задача была такая, на входы ардуинки приходит сигнал, после этого ардуино должна сделать пост запрос на айпи адрес. Из комплектующих arduino uno, hr911105a.
Как-то совсем не выходит сделать пост запрос, чего-то я не понимаю, пробовал библиотеку ethercard.
Да, с таким комплектом сложно POST запрос будет отправить. ))
https://www.chipdip.ru/product/hr911105a
ENC28J60 Enternet HR911105A
Обшибся)
Ну теперь желательно выложить Ваш код (в соответствии с правилами форума), где вы пробовали.
Пробовал с этим работать, но не совсем понял, как свои переменные, если их так можно назвать, вставить в этот код, также есть ошибка относительно кода, хоть убей, софту не нравится Ethernet
========================================
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/pesochnitsa-no...
Буду исправляться, увы, но я и правда совсем зелёный, скоро подкорректирую вопрос и сделаю по правилам и обычаям :)
UIPEthernet оригинальный будет попроще. От Нортберта который.
Только вот понятия не имею, как работать с этой библиотекой
Так же, как со стоковой Ethernet из Arduino IDE.
Я тут немного продвинулся, но опять воткнулся в землю, адрес по dhcp получает, но запрос до адресата не доходит, в чём может быть дело?
Из чего следует "не доходит?"
Камере много чего может не нравится и она не обязана отвечать на все подряд.
Сделайте запрос на локальный XAMPP, убедитесь в этом.
то бишь, ошибка в формулировке запроса, так?
есть смысл через wireshark пробовать смотреть?
Всегда есть смысл зацепить реальный обмен или фидлером или вайршарком.