HTML-sivu olisi parempi tallentaa erilliseen tiedostoon ja lukea sieltä vaikka ajon aikana.
Jos tarkoituksena on rakentaa jonkinlainen templaattimekanismi joka täydentää ja tarjoaa www-sivuja web-palvelimen tapaan, suosittelisin tutkimaan myös valmiita ratkaisuja. Pyörää ei yleensä kannata keksiä uudelleen ainakaan alusta lähtien.
Juuri tällainen taitaa olla tilanne? Haluaisin kätevän syötesivun, jolla voin syötellä esimerkiksi päivittäisiä sähkömittarilukemia ja lämpötiloja tms. tiedostoon niin, että samalla saisin syötettävät tiedot saisi tarkistettua samalla. Tarkistukset voisi luultavasti tehdä helpoiten javascriptillä, koska osaan sitä jo vähän. Olisi hyvä, jos syötesivun kautta menevät tiedot näkyisivät suoraan seurantasivulla. Syötearvot menevät nyt html-lomakkeen kautta ja libhttpserver osaa lukea syötekenttien arvot.
Mutta libhttpserverin kautta avautuva seurantasivu näyttää sivun tekstinä eikä ymmärrä tulkita sitä html:ksi. Libhttpserverissä resurssi on merkitty "/hello" , mikä voinee vaikuttaa siihen, että selain ei tulkitse sitä html:ksi. Mutta jos resurssiksi vaihdetaan "/hello.html" , mitään ei palauteta eli tulee not found -ilmoitus.
Ehkä libhttpserveristä pitäisi hello-esimerkin sijasta joku toinen esimerkki ja yrittää sen avulla?
Millä hakutermeillä löytyisi kotikäyttöön sopiva templatesysteemi?
Tällä koodilla pärjään siis libhttpserverille asti, mutta syötettyjen arvojen saaminen siististi takaisin selaimeen ei toimi.
#include <iostream>
#include "/home/k1/Documents/my_libhttpserver/libhttpserveri/libhttpserver/src/httpserver.hpp"
#include <iostream>
#include <fstream>
#include <string>
#include <bits/stdc++.h>
std::string filetostring(const std::string& filename)
{
std::fstream newfile;
std::string string1; // tiedosto stringinä
newfile.open(filename, std::ios::in);
if(newfile.is_open() )
{
std::string row1;
while(getline(newfile, row1))
{
string1 += '\n' + row1;
} // while loppuu
} // if loppuu
return string1;
} // filetostring loppuu
class hello_world_resource : public httpserver::http_resource
{
public:
const std::shared_ptr<httpserver::http_response> render(const httpserver::http_request&);
std::string data01, data02;
};
// Using the render method you are able to catch each type of request you receive
const std::shared_ptr<httpserver::http_response> hello_world_resource::render(const httpserver::http_request& req)
{
std::cout << std::endl;
std::string datapar01 = req.get_arg("data01");
std::string datapar02 = req.get_arg("data02");
std::string datapar03 = req.get_arg("data03");
std::string datapar04 = req.get_arg("data04");
std::string datapar05 = req.get_arg("data05");
std::string datapar06 = req.get_arg("data06");
std::string datapar07 = req.get_arg("data07");
std::string datapar08 = req.get_arg("data08");
std::string datapar09 = req.get_arg("data09");
std::string datapar10 = req.get_arg("data10");
std::string datapar11 = req.get_arg("data11");
std::cout << "Now data 1 is:" << datapar01 << std::endl;
std::cout << "Now data 2 is:" << datapar02 << std::endl;
std::cout << "Now data 3 is:" << datapar03 << std::endl;
std::string windowstring1 = filetostring("seurantakaavake01.html");
//std::string windowstring2 = "pvm.setAttribute(\"value\" , "\"" + datapar01 + "\"); ";
std::string windowstring2 =
"pvm.setAttribute(\"value\" ,\"" + datapar01 + "\"); ";
std::string windowstring3 = " } </script></body></html> \n";
std::string ws = windowstring1 + windowstring2 + windowstring3;
return std::shared_ptr<httpserver::http_response>(new
httpserver::string_response(ws, 200));
}
int main()
{ // porttinumero ja säiemäärä parametreina
httpserver::webserver ws = httpserver::create_webserver(8080).start_method(httpserver::http::http_utils::INTERNAL_SELECT).max_threads(5);
hello_world_resource hwr;
ws.register_resource("/hello.html", &hwr, true);
ws.start(true); // blocking on true, non blocking olisi false
return 0;
}
Käännös meni näin
g++ libhttpserver02.cpp -o libhttpserver02 -Wall -pedantic -L/usr/local/lib -lhttpserver -lmicrohttpd -pthread -std=c++17