Kirjoittaja Aihe: [ ratkaistu ] libhttpserver ja lomakekenttien arvojen välitys  (Luettu 3521 kertaa)

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Kkeilussa on tällainen libhttpserver-ohjelma

Koodia: [Valitse]
#include <iostream>
//// /home/k1/Documents/my_libhttpserver/libhttpserveri/libhttpserver/
#include "/home/k1/Documents/my_libhttpserver/libhttpserveri/libhttpserver/src/httpserver.hpp"

class hello_world_resource : public httpserver::http_resource {
 public:
     const std::shared_ptr<httpserver::http_response> render(const httpserver::http_request&);
     void set_some_data(const std::string &s) {data = s;}
     std::string data;
};

// 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) {
    // It is possible to store data inside the resource object that can be altered through the requests
    std::cout << "Data was: " << data << std::endl;
    std::string datapar = req.get_arg("data");
    set_some_data(datapar == "" ? "no data passed!!!" : datapar);
    std::cout << "Now data is:" << data << std::endl;

    // It is possible to send a response initializing an http_string_response that reads the content to send in response from a string.
    return std::shared_ptr<httpserver::http_response>(new httpserver::string_response("Hello World!!!", 200));
}

int main() {
    // It is possible to create a webserver passing a great number of parameters. In this case we are just passing the port and the number of thread running.
    httpserver::webserver ws = httpserver::create_webserver(8080).start_method(httpserver::http::http_utils::INTERNAL_SELECT).max_threads(5);

    hello_world_resource hwr;
    // This way we are registering the hello_world_resource to answer for the endpoint
    // "/hello". The requested method is called (if the request is a GET we call the render_GET
    // method. In case that the specific render method is not implemented, the generic "render"
    // method is called.
    ws.register_resource("/hello", &hwr, true);

    // This way we are putting the created webserver in listen. We pass true in order to have
    // a blocking call; if we want the call to be non-blocking we can just pass false to the method.
    ws.start(true);
    return 0;
}

joka on käännetty komennolla

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

html-sivun lomakkeelta parametrit siirtyvät data-nimisten kenttien avulla.

Koodia: [Valitse]
<!DOCTYPE html>
<html>
<body>

<h1>Lomakekokeilu post- ja get-menetelmät</h1>

<form action=" http://localhost:8080/hello"  method="post">
  <label for="fname1">First name:</label>
  <input type="text" id="fnameid1" name="data"><br><br>
  <label for="fnmame2">Last data:</label>
  <input type="text" id="dataid2" name="data"><br><br>
 
  <button type="submit">Lähetä post</button>
  </form>
  </br> </br> </br> </br>
 
  <!--  get ei lähettäne ääkkösiä oikein --!>
 
  <form action=" http://localhost:8080/hello"  method="GET">
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="data"><br><br>
  <label for="data">Last data:</label>
  <input type="text" id="data" name="data"><br><br>
 
  <button type="submit">Lähetä get</button>
  </form>
  "   "
  </br> </br> </br> </br>
 
<form>
  <button type="submit" formaction="http://localhost:8080/hello"
          method="post">Lähetä tyhjä post
  </button>
</form>

</body>
</html>

Mutta kentät näyttävät menevän suoraan peräkkäin libhttpserver-ohjelmaan. Toivomus olisi saada kentät erotelluiksi ja jos mahdollista muodossa kenttänimi kenttäarvo -pareina libhttpserver-puolelle, jos mahdollista mahdollisimman vähillä javascript-kikkailuilla html-puolella. Ehkä vähän php:n post-taulukon tyylisesti.




« Viimeksi muokattu: 23.01.22 - klo:14.01 kirjoittanut teele »

raimo

  • Käyttäjä
  • Viestejä: 4268
  • openSUSE Tumbleweed
    • Profiili
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #1 : 22.01.22 - klo:17.36 »
ei <br> koodia tarvitse sulkea </br>llä. Kirjoita vaan rohkeasti  rivin loppuun <br /> muuta ei tarvita.
Tietä käyden tien on vanki. Vapaa on vain umpihanki.
Aaro Hellaakoski

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #2 : 22.01.22 - klo:21.17 »
Koodia: [Valitse]
<form action=" http://localhost:8080/hello"  method="post">
  <label for="fname1">First name:</label>
  <input type="text" id="fnameid1" name="data"><br><br>
  <label for="fnmame2">Last data:</label>
  <input type="text" id="dataid2" name="data"><br><br>

Mutta kentät näyttävät menevän suoraan peräkkäin libhttpserver-ohjelmaan. Toivomus olisi saada kentät erotelluiksi ja jos mahdollista muodossa kenttänimi kenttäarvo -pareina libhttpserver-puolelle

Molempien kenttien nimi on "data". Vaihda ensimmäiseen tunnisteeksi vaikka name="firstname" ja toiseen name="lastdata", niin voit erottaa ne palvelimen puolella.

AimoE

  • Käyttäjä
  • Viestejä: 2782
    • Profiili
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #3 : 22.01.22 - klo:21.40 »
Koodia: [Valitse]
<form action=" http://localhost:8080/hello"  method="post">
  <label for="fname1">First name:</label>
  <input type="text" id="fnameid1" name="data"><br><br>
  <label for="fnmame2">Last data:</label>
  <input type="text" id="dataid2" name="data"><br><br>

Mutta kentät näyttävät menevän suoraan peräkkäin libhttpserver-ohjelmaan. Toivomus olisi saada kentät erotelluiksi ja jos mahdollista muodossa kenttänimi kenttäarvo -pareina libhttpserver-puolelle

Molempien kenttien nimi on "data". Vaihda ensimmäiseen tunnisteeksi vaikka name="firstname" ja toiseen name="lastdata", niin voit erottaa ne palvelimen puolella.

Eikö olisi kutenkin parempi että name-arvo on sama kuin id-arvo? Noi id-arvot kun on jo erilliset.

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #4 : 23.01.22 - klo:10.29 »
 
Korjasin <br/> -muodoiksi

Id- ja name-arvot olivat tai ovat tosiaan vähän sekavia, kun yritän tehdä nopeita kokeiluja löytääkseni keinon saada kentät erilleen palvelimen puolella.

Nyt ensimmäisen lomakkeen eli post-lomakkeen ensimmäisen kentän nimeksi on kokeiltu ainakin data1 ja toisen kentän nimeksi data2. En tiedä, miten tässä söhläilen, mutta näyttää siltä, että kenttien syöttöarvot eivät välity tai ainakaan näy palvelinpuolella, jos name on joku muu kuin data??  Eli mukana olevassa html-listauksessa  toisen kentän nameksi on vaihdettu takaisin data. Muistaakseni alun perin name-arvot ovat olleet jotain muuta, mutta silloin ei välittynyt palvelinpuolelle mitään.

Koodia: [Valitse]
<!DOCTYPE html>
<html>
<body>

<h1>Lomakekokeilu post- ja get-menetelmät</h1>

<form action=" http://localhost:8080/hello"  method="post">
  <label for="fname1">First name:</label>
  <input type="text" id="fnameid1" name="data1"><br><br>
  <label for="fnmame2">Last data:</label>
  <input type="text" id="dataid2" name="data"><br><br>
 
  <button type="submit">Lähetä post</button>
  </form>
  </br> <br/> <br/> <br/>
 
  <!--  get ei lähettäne ääkkösiä oikein --!>
 
  <form action=" http://localhost:8080/hello"  method="GET">
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="data"><br><br>
  <label for="data">Last data:</label>
  <input type="text" id="data" name="data"><br><br>
 
  <button type="submit">Lähetä get</button>
  </form>
  "   "
  <br/> <br/> <br/> <br/>
 
<form>
  <button type="submit" formaction="http://localhost:8080/hello"
          method="post">Lähetä tyhjä post
  </button>
</form>

</body>
</html>

En löydä palvelinpulen ohjelmasta sellaista kohtaa, jossa vaadituksi kenttänimeksi laitettaisiin esimerkiksi stringi "data".

html-kenttien syöttöarvot näyttävät menevän yhteen palvelinpuolella, tämä on siis tilanne, kun kummatkin kentät on nimetty dataksi. Jos kenttä ei ole nimetty dataksi, mitään ei välity html-puolelta palvelinpuolelle. Tai sitten sählään taas jossain .....
« Viimeksi muokattu: 23.01.22 - klo:10.48 kirjoittanut teele »

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #5 : 23.01.22 - klo:10.53 »
Tässä kohti koodissasi määrität, minkä nimisen kentän tiedot luet palvelimelle lähetetyistä tiedoista:
Koodia: [Valitse]
std::string datapar = req.get_arg("data");
Voit lukea useamman kentän sisällöt määrittelemättä useamman muuttujan ja kutsumalla jokaiselle kenttänimelle tuota get_arg funktiota.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

raimo

  • Käyttäjä
  • Viestejä: 4268
  • openSUSE Tumbleweed
    • Profiili
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #6 : 23.01.22 - klo:11.02 »
Lainaus
Korjasin <br/> -muodoiksi

Pitää olla välilyönti eli <br />
Tietä käyden tien on vanki. Vapaa on vain umpihanki.
Aaro Hellaakoski

teele

  • Käyttäjä
  • Viestejä: 850
    • Profiili
Vs: libhttpserver ja lomakekenttien arvojen välitys
« Vastaus #7 : 23.01.22 - klo:11.07 »
no nyt alkaa selvetä vähän, en tosiaan ollut huomannut "data" kohtaa palvelinpuolella .....

korjaan <br /> :ksi   rivinvaihdot .....

Muokkaus:

Vaikuttaa siltä, että nyt parametrit välittyvät

Koodia: [Valitse]

#include <iostream>
#include "/home/k1/Documents/my_libhttpserver/libhttpserveri/libhttpserver/src/httpserver.hpp"

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::cout << "Now data 1 is:" << datapar01 << std::endl;
  std::cout << "Now data 2 is:" << datapar02 << std::endl;
  return std::shared_ptr<httpserver::http_response>(new httpserver::string_response("Hello World!!!", 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", &hwr, true);
  ws.start(true);  // blocking on true, non blocking olisi false
  return 0;
}

Käännöskomento oli

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

Kokeilu-html-sivu on nyt tällainen

Koodia: [Valitse]
<!DOCTYPE html>
<html>
<body>

<h1>Lomakekokeilu post- ja get-menetelmät</h1>

<form action=" http://localhost:8080/hello"  method="post">
  <label for="fname1">First name:</label>
  <input type="text" id="fnameid1" name="data01"><br><br>
  <label for="fnmame2">Last data:</label>
  <input type="text" id="dataid2" name="data02"><br><br>
 
  <button type="submit">Lähetä post</button>
  </form>
  <br /> <br/ > <br/ > <br/ >
 
  <!--  get ei lähettäne ääkkösiä oikein --!>
 
  <form action=" http://localhost:8080/hello"  method="GET">
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="data01"><br><br>
  <label for="data">Last data:</label>
  <input type="text" id="data02" name="data02"><br><br>
 
  <button type="submit">Lähetä get</button>
  </form>
  "   "
  <br/ > <br/ > <br/ > <br/ >
 
<form>
  <button type="submit" formaction="http://localhost:8080/hello"
          method="post">Lähetä tyhjä post
  </button>
</form>

</body>
</html>

Toivottavasti tuli br:t oikein.

Varmaan tämän säikeen uskaltaisi nyt laittaa ratkaistuksi.

Kiitos neuvoista  :)
« Viimeksi muokattu: 23.01.22 - klo:14.00 kirjoittanut teele »