Jak parsovat URL s dotazy pomocí webového serveru ESP-IDF na ESP32

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