Kirjoittaja Aihe: [ ratkaistu ] html-sivukoodin lukeminen c++ std::string muuttujaan  (Luettu 3014 kertaa)

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Yrittäisin saada std::string-tyyppisen muuttujan arvoksi html-sivun koodin. Tässä  alla pieni lomakekokeiolu, joka ei toimi, MIkä olisi hyvä tapa laittaa std::stringin arvoksi html-koodia, olisiko siihen jotain oikotietä vai pitääkö \ -merkkejä vain sijoitella eri paikkoihin tai kahdentaa " -merkkejä tai ......... ?

Koodia: [Valitse]

#include <iostream>
int main()

{
  std::string str4 =
     " <form action=" http://localhost:8080/hello"  method="post"> "  ";
  std::cout << str4 << std::endl;
 
  return 0;
}
« Viimeksi muokattu: 03.02.22 - klo:21.19 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: html-sivukoodin lukeminen c++ std::string muuttujaan
« Vastaus #1 : 29.01.22 - klo:21.56 »
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.

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Vs: html-sivukoodin lukeminen c++ std::string muuttujaan
« Vastaus #2 : 02.02.22 - klo:10.47 »
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.

Koodia: [Valitse]

#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

Koodia: [Valitse]
g++ libhttpserver02.cpp -o libhttpserver02 -Wall -pedantic -L/usr/local/lib -lhttpserver -lmicrohttpd  -pthread -std=c++17






nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: html-sivukoodin lukeminen c++ std::string muuttujaan
« Vastaus #3 : 02.02.22 - klo:12.28 »
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.

Ei liity URL:ään. Selain ei päättele sisällön tyyppiä osoitteen perusteella vaan content-typen mukaan. Aseta siis libhttpserverissä responsen content_type-parametriksi "text/html":

Koodia: [Valitse]
return std::shared_ptr<httpserver::http_response>(new
  httpserver::string_response(ws, 200));
->
Koodia: [Valitse]
return std::shared_ptr<httpserver::http_response>(new
  httpserver::string_response(ws, 200, "text/html"));


Mutta jos resurssiksi vaihdetaan "/hello.html" , mitään ei palauteta eli tulee not found -ilmoitus.

Tuossa sinulla on ollut jokin virhe palvelimen polkujen määrittelyissä.


Millä hakutermeillä löytyisi kotikäyttöön sopiva templatesysteemi?

C++ template engine. Sen perään hakusanat web tai html voivat ohjata oikeaan suuntaan. Tällainen tuli pikaisella haulla vastaan: https://github.com/pantor/inja

Jos C++:lla meinaisi tehdä laajempaa web-sovellusten kehitystä, Wt voisi helpottaa asioita.