Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 22.01.22 - klo:17.19

Otsikko: [ ratkaistu ] libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: teele - 22.01.22 - klo:17.19
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.




Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: raimo - 22.01.22 - klo:17.36
ei <br> koodia tarvitse sulkea </br>llä. Kirjoita vaan rohkeasti  rivin loppuun <br /> muuta ei tarvita.
Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: nm - 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.
Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: AimoE - 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.
Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: teele - 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 .....
Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: Tomin - 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.
Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: raimo - 23.01.22 - klo:11.02
Lainaus
Korjasin <br/> -muodoiksi

Pitää olla välilyönti eli <br />
Otsikko: Vs: libhttpserver ja lomakekenttien arvojen välitys
Kirjoitti: teele - 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  :)