Как составить 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-запросы.

, 👍2


1 ответ


Лучший ответ:

0

Дополнительный вопрос: объясните, пожалуйста, разницу между 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"
,

Спасибо, ваше решение - это то, что я искал. Однако я не знаю, было ли «сначала выучить C++» очень конструктивным. Arduino предназначен для использования в качестве автономного продукта, предназначенного для обучения, и для многих это первое знакомство с программированием. Я также просто подумал, что добавлю ссылку на статью, которая подробно объясняет и помогает мне понять, что такое строки, массивы символов и эффективное управление использованием памяти. [Зло струн Arduino](https://majko.co.uk/blog/evils-arduino-strings), @justinjt

@justincs Я думаю, что идея о том, что Arduino должна быть автономной, проблематична; используемый язык - C++, нужно знать достаточно C++, чтобы использовать Arduino, скрытие этого факта или притворство, что он не имеет значения/существует, оказывает медвежью услугу пользователям. Это только еще больше запутывает ситуацию; есть упрощение, а есть упрощение! Теперь у пользователей есть две проблемы: их первоначальная проблема и одновременное обучение программированию; ИМХО это приносит больше вреда, чем пользы., @esoterik