Esta classe utilitária permite analisar facilmente URLs de consulta. Para usá-la, você deve adicionar -std=gnu++17 ou posterior às suas flags de compilador.
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) {
// Alocar buffer temporário para armazenar o parâmetro
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");
// Definir string como string vazia => "não encontrado"
this->queryURLString = "";
} else {
// Copiar para uma std::string
this->queryURLString = std::string(buf, queryURLLen);
}
delete[] buf;
}
}
std::string GetParameter(const char* key) {
// Alocar espaço suficiente para armazenar o parâmetro.
// NOTA: O parâmetro só pode ser tão longo quanto a própria URL de consulta.
// Portanto, alocar espaço "demais" antecipadamente
// evitará cópias desnecessárias
size_t bufSize = queryURLString.size();
char* buf = (char*)malloc(bufSize);
/* Obter valor da chave esperada da string de consulta */
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 "";
}
// Converter para std::string
std::string param(buf);
free(buf);
// Encolher o parâmetro para que caiba.
return param;
}
private:
std::string queryURLString;
};Exemplo de uso:
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 Fazer algo com [url]
return SendStatusOK(req);
}
};SendStatusError() e SendStatusOK() são do nosso post Servidor web ESP-IDF: Como responder com mensagem JSON de sucesso ou erro.
Check out similar posts by category:
C/C++ ESP8266/ESP32
If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow