Tato pomocná třída vám umožňuje snadno parsovat URL s dotazy. Pro její použití, musíte přidat -std=gnu++17 nebo novější do vašich přepínačů kompilátoru.
query_url_parser.cpp
class QueryURLParser {
public:
QueryURLParser(httpd_req_t *req) {
size_t queryURLLen = httpd_req_get_url_query_len(req) + 1;
if(queryURLLen > 1) {
// Alokovat dočasný buffer pro uložení parametru
char buf[queryURLLen] = {0};
if (httpd_req_get_url_query_str(req, buf, queryURLLen) != ESP_OK) {
ESP_LOGE("Query URL parser", "Failed to extract query URL");
// Nastavit řetězec na prázdný řetězec => "nenalezeno"
this->queryURLString = "";
} else {
// Zkopírovat do std::string
this->queryURLString = std::string(buf, queryURLLen);
}
delete[] buf;
}
}
std::string GetParameter(const char* key) {
// Alokovat dostatek místa pro uložení parametru.
// POZNÁMKA: Parametr může být tak dlouhý, jako je samotné dotazové URL.
// Proto alokace "příliš velkého" místa dopředu
// zabrání zbytečnému kopírování
size_t bufSize = queryURLString.size();
char* buf = (char*)malloc(bufSize);
/* Získat hodnotu očekávaného klíče z dotazového řetězce */
esp_err_t err = httpd_query_key_value(queryURLString.c_str(), key, buf, bufSize);
if(err != ESP_OK) {
ESP_LOGE("Query URL parser", "parsing URL");
Serial.println(esp_err_to_name(err));
free(buf);
return "";
}
// Převést na std::string
std::string param(buf);
free(buf);
// Zkrátit parametr, aby se vešel.
return param;
}
private:
std::string queryURLString;
};Příklad použití:
query_url_usage.cpp
static const httpd_uri_t setMQTTURLHandler = {
.uri = "/api/set-mqtt-url",
.method = HTTP_GET,
.handler = [](httpd_req_t *req) {
QueryURLParser parser(req);
std::string url = parser.GetParameter("url");
if(url.empty()) {
return SendStatusError(req, "Query parameter 'url' missing");
}
// TODO Udělat něco s [url]
return SendStatusOK(req);
}
};SendStatusError() a SendStatusOK() jsou z našeho blogpostu Webový server ESP-IDF: Jak odpovědět se zprávou JSON o úspěchu nebo chybě.
Podívejte se na podobné články podle kategorie:
C/C++ ESP8266/ESP32
Pokud vám tento článek pomohl, zvažte, zda mi nekoupíte kávu nebo nepřispějete přes PayPal na podporu výzkumu a publikování nových článků na TechOverflow