Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
Я экспериментирую с кодом, работающим на плате ESP8266, для получения данных с помощью веб-API. Я хотел бы сохранить адрес хоста и параметры ключа/значения (ключ API и т. д.) запроса GET в виде констант/переменных (я не уверен, что лучше), а затем использовать их для составления полного URL-адреса GET.
Как составить полный URL-адрес из отдельных строк/массивов символов, включая правильный синтаксис для пар ключ/значение?
EDIT: просто добавлю, что я использую библиотеку ESP8266HTTPClient.
В приведенном мной примере используется базовый URL-адрес API без параметров, а URL-адрес хоста хранится следующим образом:
const char* host = "http://somehost.com/dir/1";
(Дополнительный вопрос: объясните, пожалуйста, разницу между const char* host
и const char *host
, если она есть)
Используя этот простой URL-адрес, я могу успешно получить данные JSON, используя этот метод:
HTTPClient http;
http.begin(host);
int httpCode = http.GET();
Serial.print("HTTP RESPONSE: ");
Serial.println(httpCode);
if (httpCode > 0) {
String payload = http.getString();
Serial.println("PAYLOAD:");
Serial.println(payload);
}
http.end()
Я рассматриваю возможность использования библиотеки "ArduinoJson" для управления данными json вместо String, но сейчас меня больше интересует, как составить URL-адрес.
Чего я хотел бы достичь, так это добавления параметров "ключ/значение", хранящихся в виде переменных, к URL-адресу хоста, например:
const char* host = "http://somehost.com/dir/1";
char* app = "123";
char* user = "123456"
char* api_key = "XXXXXXXXXXXXX";
А затем соедините их с помощью строк или массивов символов, чтобы создать полный URL-адрес, или просто передайте адрес хоста и значения параметров функции, которая составляет URL-адрес или отправляет полный запрос GET (с параметром "key=var" , вопросительный знак, амперсанды и т. д.):
http://somehost.com/dir/1/?appid=123&userid=123456&key=XXXXXXXXXXXXX
Этого было очень легко добиться в python с помощью HTTP-библиотеки "requests". Я смог сохранить параметры ключ/значение в виде dict, а затем передать адрес хоста и параметр dict в функцию requests.get
, и она автоматически составила URL-адрес.
Думаю, здесь скрыто больше одного вопроса, но главный из них: "Как лучше всего составить полный URL без жесткого кодирования всего этого?" Например, я мог бы изменить некоторые параметры, такие как appid, путем ввода пользователем перед выполнением запроса GET.
Я не уверен, использую ли я правильный подход, используя массивы символов, константы или переменные, использую ли я правильный подход, пытаясь составить его вручную, и в целом, каковы наилучшие способы сделать это эффективно и избежать фрагментация памяти (какая проблема при использовании строковых переменных?). Это устройство должно будет работать постоянно и периодически делать эти GET-запросы.
@justinjt, 👍2
1 ответ
Лучший ответ:
Дополнительный вопрос: объясните, пожалуйста, разницу между const char* host и const char *host, если она есть
Разницы нет; обратите внимание, что IDE arduino использует C++! Если вы не знаете C или C++, вы должны сначала изучить их.
"Как лучше составить полный URL без жесткого кодирования всего этого?"
В основном это тот же вопрос, что и при манипулировании строками C, т. е. компоновке, объединении, конкатенации. строковые функции c
вот краткий пример, без проверки ошибок и т.д.:
const char* host = "http://somehost.com/dir/1";
char* app = "123";
char* user = "123456"
char* api_key = "XXXXXXXXXXXXX";
char urlout[255];
// мы собираемся начать здесь
strcpy(urlout, host);
strcat(urlout, "/?appid=");
strcat(urlout, app);
strcat(urlout, "&userid=");
strcat(urlout, user);
strcat(urlout, "&key=");
strcat(urlout, api_key);
// urlout == "http://somehost.com/dir/1/?appid=123&userid=123456&key=XXXXXXXXXXXXX"
- Как заменить объекты String массивами символов, продолжая использовать строковые методы
- Преобразование строки в IP-адрес
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Проанализировать большой ответ json с помощью ESP8266
- Как исправить код утечки памяти в ESP8266/NodeMCU, вызванный концентрацией строк?
Спасибо, ваше решение - это то, что я искал. Однако я не знаю, было ли «сначала выучить C++» очень конструктивным. Arduino предназначен для использования в качестве автономного продукта, предназначенного для обучения, и для многих это первое знакомство с программированием. Я также просто подумал, что добавлю ссылку на статью, которая подробно объясняет и помогает мне понять, что такое строки, массивы символов и эффективное управление использованием памяти. [Зло струн Arduino](https://majko.co.uk/blog/evils-arduino-strings), @justinjt
@justincs Я думаю, что идея о том, что Arduino должна быть автономной, проблематична; используемый язык - C++, нужно знать достаточно C++, чтобы использовать Arduino, скрытие этого факта или притворство, что он не имеет значения/существует, оказывает медвежью услугу пользователям. Это только еще больше запутывает ситуацию; есть упрощение, а есть упрощение! Теперь у пользователей есть две проблемы: их первоначальная проблема и одновременное обучение программированию; ИМХО это приносит больше вреда, чем пользы., @esoterik