Zastanawiasz się jak serwować pliki statyczne w Pistache? To banalnie proste!

Czytanie danych z pliku - metoda Http::serveFile

To jak odczytać plik JSON i odesłać go w całości do użytkownika było jednym z pierwszych zadań jakie postawiłem sobie podczas nauk Pistache i RapidJSON. Opisany wtedy sposób działa i ma swoje zalety (o których za chwilkę). Ma też swoje wady

  • wymaga otwarcia pliku, parsowania przez RapidJSON i własnoręcznego tworzenia strumienia odpowiedzi. Można to zrobić w Pistache inaczej.

Framework Pistache posiada wbudowaną metodę odsyłania do przeglądarki plików statycznych, oto jak możesz to zrobić:

void DrugsHandler::onRequest(const Net::Rest::Request& request, Net::Http::ResponseWriter response) {
    
    Document config;
    char _config_buffer[65536];
    
    FILE* config_pointer = fopen("config.json", "r");
    FileReadStream config_stream(config_pointer, _config_buffer, sizeof(_config_buffer));
    config.ParseStream(config_stream);
    fclose(config_pointer);
    
    if (config.HasMember("files_path")) {
        
        std::ostringstream s;
        s << config["files_path"].GetString() << "/drugs.json";
        
        Http::serveFile(response, s.str().c_str(), MIME(Application, Json));
            
    } else {
        response.send(Http::Code::Internal_Server_Error);
    }
    
}

Jeśli porównasz ten kod z poprzednio prezentowaną wersją tej metody, to zauważysz że nie ma tu już zabawy w otwieranie pliku z listą leków, ustawiania nagłówków odpowiedzi, strumieniowania pliku. Wszystko załatwia metoda Http::serveFile. Metoda ta jako argumentu przyjmuje, po kolei, obiekt odpowiedzi, ścieżkę do pliku i opcjonalnie typ zwracanej odpowiedzi. Co się dzieje gdy pliku nie ma w podanej ścieżce na dysku? Wysłana zostanie pusta odpowiedź z kodem 404. Dodatkowo, metoda ta zwraca obiekt promise, a obsługując go możemy zrobić np. logowanie zdarzeń/błędów (obiekt ten przenosi informację o ilości wysłanych danych).

Wady i zalety

Do zalet można Http::serveFile można zaliczyć:

  • zwięzłość
  • szybkość
  • obsługę Content-Type
  • obsługę błędów

Do minusów tej metody można zaliczyć:

  • wysyłanie pliku bez parsowania (być może to nie JSON?)
  • wysyłanie pliku takim jak jest - nie są usuwane z niego zbędne białe znaki, zachowywane jest formatowanie, odpowiedź może “ważyć” więcej niż po przeparsowaniu przez RapidJSON
  • w przypadku braku pliku kodem odpowiedzi musi być 404

Pokazane w tym wpisie przykłady są zaczerpnięte z aplikacji DDS.