Näytä kirjoitukset

Tässä osiossa voit tarkastella kaikkia tämän jäsenen viestejä. Huomaa, että näet viestit vain niiltä alueilta, joihin sinulla on pääsy.


Viestit - teele

Sivuja: 1 ... 6 7 [8] 9 10 ... 41
141

Tämän säikeen ansiosta kokeilin ensimmäisen kerran

Koodia: [Valitse]
echo $PATH

ja, tosiaan, vaikuttaa siltä, että sillä saa polun näkyviin :)

142
Ubuntu tietokoneissa / [ ratkaistu } php 7.2 -päivitys
« : 04.03.22 - klo:20.00 »
Laitoin tarjotut päivitykset ja huomasin, että php:n kanssa kehotetaan ajamaan vielä muutamia ohjelmia. Mutta tämä ilmoitus on keskellä päivityksen tekstiselvitystä ja sen  jälkeen tulee vielä ilmoitusta up php.

En oikein osaa teksteistä päätellä, tekikö päivitys jo tarvittavat muutokset itse, vai pitäisikö ne käsketyt ohjelmat vielä ajaa. Niiden nimet ovat ainakin itselleni ihan outoja.

Päivityksen palautetekstiä on tässä alla ja siitä näkyy viitatut kehotukset ohjelmien ajamiseen ja se, että päivitys eteni vielä kehotusten jälkeen. En muistaakseni ole itse koskaan koskenut mihinkään säätöön apachessa, missä olisi ollut jotain proxy-mainintaa.



Koodia: [Valitse]
NOTICE: Not enabling PHP 7.2 FPM by default.
NOTICE: To enable PHP 7.2 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.2-fpm
NOTICE: You are seeing this message because you have apache2 package installed.
Setting up php7.2 (7.2.24-0ubuntu0.18.04.11) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
Processing triggers for systemd (237-3ubuntu10.53) ...

Muokk.

Näyttää toimivan ilman ohjelmien ajoakin ja versiokikin näyttää oikealta

Koodia: [Valitse]
$ php -v
PHP 7.2.24-0ubuntu0.18.04.11 (cli)

Koska proxy-asioista ei ole mitään käsitystä eikä niihin ole aikasemminkaan koskettu, arvaus on, että tämä säie voidaan laittaa ratkaistuksi :)


143

Post-parametrin välitys aiheuttaa ongelmia libhttpseverissä. Eroaako post-parametrin rekisteröinti get-parametrin rekisteröinnistä libhttpserverissä niin, että httpserver::http_request& hyväksyy vain get_arg -menetelmän get-parametreiile.

Kokeilin tällaista luokkaa

Koodia: [Valitse]
class file_response_resource3 : public httpserver::http_resource
{
 public:
 const std::shared_ptr<httpserver::http_response> render_POST(const httpserver::http_request& req)
{
  std::string datapar06 = req.get_arg("data06");  // ??????
  std::cout << "!!!!!!!data06 on nyt:" << datapar06 << std::endl; // ??????
  return std::shared_ptr<httpserver::file_response>(new httpserver::file_response("textareafile.html", 200, "text/html"));
     }
}; // luokka file_response_resource3 loppuu


tällaisen javascript-funktion kautta

Koodia: [Valitse]
async function fetch_textareafile02() // postina, libhttpserverissä
{                                     // laitettava postiksi
 let response = await fetch('textareafile.html',
     {
      method: 'POST',
      headers: {
                 "Content-Type": "text/plain;charset=UTF-8"
               },
      body: { 'data06': 'ÖÅÖÅÖÅÖÅÖÅÖÅÖÅÖÅÖÅÖÅ ' }
       }
     );
  let text = await response.text();
  form_var = document.getElementById("form01");
  textarea_var = form_var.tekstialue_id;
  textarea_var.value += text + '\t'; 
}

Html sivulla tekstialue päivittyy, mutta libhttpserver-puolella parametrin arvo ei tulostu. Kokeilin myös    post_arg("data06"); , mutta arvaus meni vähän pieleen, koska vain get_arg menetelmä on olemassa. Eroavatko get- ja post-käsittelyt libhttpserverissä jotenkin html-parametrien suhteen, vai teenkö taas jonkun mielikuvituksekkaan virheen tässäkin asiassa.



144

Kun tiedot nyt kulkevat libserverin ja html-sivun välillä kumpaankin suuntaan, voisi olla mahdollista kokeilla oikean, ulospäinkin näkyvän nettisuvun tekemistä. Tämä tarkoittanee salausta eli https yhteyttä nykyään.

Valitettavasti osaamisesta puuttuu vielä pari "pientä yksityiskohtaa":

miten hankitaan salausavaimet
minne ne laitetaan
miten kerrotaan libhttpserverille, mistä se voi ne löytää
jos sivupyynnössä on https-muoto, osaako libhttprerver siitä päätellä, että salattua muotoa käytetään, vai pitääkö se ottaa huomioon c++ -koodia kirjoitettaessa

Eli nämä "pikkuasiat"  aluksi :)

Olisi kuitenkin mukava, jos pystyisi kirjoittelemaan vähän vuorovaikutteisiakin sivuaja ilman, että pitää uppoutua apachen syövereihin. Ehkä libhttpserver olisi jopa pikku sivuihin kevyempi vaihtehto.

Httphttpmicroserveristä löytyi käsikirja ja opas netistä, mutta libhttpserver ja https tai encrypt -haut eivät näytä tuovan vastauksia kysymyksiin.



 

145
libhttpserver-ohjelmaan on nyt lisätty resursiksi sivu, joka aikaisemmin avattiin selaimella tiedostona. Tältä sivulta voi nyt pyytää fetchillä tietoja toiselta sivulta, joka on libhttpserver-ohjelman toinen resurssi, jos lisätty sivu avataan localhostin kautta ja oikeasta portista

Koodia: [Valitse]
http://localhost:8080/testisy%C3%B6tt%C3%B601.html
Palvelin on nyt tällainen

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


// resurssi vastaa esimerkiksi html-sivua asiakkaan puolella
// luokan hello_world_resource määrittely
class hello_world_resource : public httpserver::http_resource
{
  public:
    const std::shared_ptr<httpserver::http_response> render(const httpserver::http_request&);
}; // luokka hello_world_resource loppuu

// Using the render method you are able to catch each type of request you receive
// resurssilla on oma renderöijä, luokan hello_world_resource renderöijä alla
const std::shared_ptr<httpserver::http_response> hello_world_resource::render(const httpserver::http_request& req)   // pyynnön parametrien nimet rekisteröidään
{
  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");
 
  // aputulostuksia rekiströityjen parametriniemien syötearvoista
  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;
 
  // response on asiakkaalle renderöijän asiakkaalle toimittama sivu 
  return std::shared_ptr<httpserver::http_response>(new   
  httpserver::string_response("viesti palvelimelta", 200, "text/plain"));
  //tai httpserver::string_response("viesti palvelimelta", 200, "text/html"));
} // resurssin hello_world_resource renderöijän määrittely loppuu tähän

// luokan file_response_resource määrittely
class file_response_resource : public httpserver::http_resource
{
 public:
     const std::shared_ptr<httpserver::http_response> render_GET(const httpserver::http_request&)
{
         return std::shared_ptr<httpserver::file_response>(new httpserver::file_response("testisyöttö01.html", 200, "text/html"));
     }
}; // luokka file_response_resource loppuu


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;
  file_response_resource frr;
  ws.register_resource("/hello", &hwr, true); //  tällä kutsutaan   
  ws.register_resource("/testisyöttö01.html", &frr, true); //  tällä kutsutaan   
  ws.start(true);  // blocking on true, non blocking olisi false
  return 0;
}

ja käännös meni näin
Koodia: [Valitse]
g++ libhttpserver03.cpp -o libhttpserver03 -Wall -pedantic -L/usr/local/lib -lhttpserver -lmicrohttpd  -pthread -std=c++17

Taas taitaa ongelma olla ratkaistu tämän palstan neuvojen avulla :)


146

No niin, nyt löytyi selaimen konsolikin, aina oppii uutta :)

Selaimen mukaan pitäisi lähettää oikeanlainen otsaketeito, jotta libhttpserveriltä tullutta pyyntöä suostuttaisiin käsittelemään.

Koodia: [Valitse]
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at file:///hello. (Reason: CORS request not http).

Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.
    test_fun file:///home/k1/Documents/my_libhttpserver/testejä/testisyöttö01.html:25
    onclick file:///home/k1/Documents/my_libhttpserver/testejä/testisyöttö01.html:1


Testisyöttösivu ja libhttpserver-ohjelma ovat samassa hakemistossa. Mutta jos otsaketiedot täytyy joka tapauksessa lähettää, niin sittenhän ohjelma toimisi ehkä jopa  monipuolisemmin, jos se saadaan toimimaan.

libhttpserver-ohjelma on tällainen

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;
 
  return std::shared_ptr<httpserver::http_response>(new
  //httpserver::string_response("viesti palvelimelta", 200, "text/html"));
 
  httpserver::string_response("viesti palvelimelta", 200, "text/plain"));
 
}

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); //  tällä kutsutaan   
  ws.start(true);  // blocking on true, non blocking olisi false
  return 0;
}



// g++ libhttpserver03.cpp -o libhttpserver03 -Wall -pedantic -L/usr/local/lib -lhttpserver -lmicrohttpd  -pthread -std=c++17


ja testisyöttösivu tällainen

Koodia: [Valitse]

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<title> testisyöttö, versio 01 </title>
</head>

<body style="text-align: left;">
 <h1 style="color: green;"> Testisyöttö 01 </h1>
 
<p> Napsauta kaavake auki </p>
<button onClick="test_fun()">Avaa kaavake </button>
<p id="prgh"></p>



 <script>
 
 async function test_fun()

  alert("kokeilufunktio alkaa");
  let response = await fetch('/hello');
  let text = await response.text(); // read response body as text
  alert(text.slice(0, 80) + '...');           
}

</script>
       
</body>   
</html>


Valitettavasti netistä ei haulla "libhttpserver CORS" juurikaan taida olla apua :(

Luulo on, että libhttpserver laittaa tarvittavia otsaketietoja automaattisesti. Pitäisikö ne kuitenkin kirjoittaa johonkin kohtaan ohjelmassa?


147
Sivun

https://javascript.info/fetch

ohjeiden  mukaan javascriptin fetchin kanssa käytetään awaitia, mutta jos await-sanan laittaa Firefoxin javascriptiin, javascriptin toiminta loppuu eikä painikkeen javascript vastaa mitään esimerkiksi tässä kokeiluohjelmassa

Koodia: [Valitse]
<!DOCTYPE html>
<html>
<head>
<title> syöttökaavake, versio 01 </title>
</head>

<body style="text-align: left;">
 <h1 style="color: green;"> Syöttökaavake </h1>
 
<p> Napsauta kaavake auki </p>
<button onClick="fetch_test_fun()">Avaa kaavake </button>
<p id="prgh"></p>

 <script>
 
 function fetch_test_fun()

  alert("kokeilufunktio alkaa");
  let response = await fetch("/hello");
  //let text = await response.text(); // read response body as text
  //alert(text.slice(0, 80) + '...');           
}
 
</script>       
</body>   
</html>

<!--
https://javascript.info/fetch
 
https://javascript.info/xmlhttprequest

 -->


Fetch vaikuttaa muuten kätevämmältä kuin xhtmlrequest, jos halutaan pikku viestejä palvelimelta vaikka libhttpserveriltä. Mitä pitäsi tehdä, await pois vai xhtmlrequestin pariin vai joku muu (mukavan helppo) ratkaisu pikku viestien kyselyyn palvelimelta.



148
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






149
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;
}

150
Pitemmässä merkkijonossa on lyhyitä alimerkkijonoja, jotka haluttaisiin korvata niiden uusilla arvoilla.

aaa  aa x0x1  aaa x2   a x3 aaaaaaaaaaaaaa x4 .....

Kaikki x-arvot halutaan korvata uusilla arvooilla, jotka voivat olla vaikka suoraan vektoriista [y0, y2, y3 .... ] tai muulla tavalla tunnettuja niin, että jokaista x-arvoa pitäisi tulla korvaamaan tunnettu uusi y:n arvo

aaa  aa y0y1  aaa y2   a y3 aaaaaaaaaaaaaa y4 .....

Miten korvaus kannattaisi tehdä c++ :aa ja sen stl: ää käyttäen niin, että ei tekisi turhan raskasta proseduuria, O(n) tuntuisi mahdolliselta.




 

151
Onko helppoa tapaa saada pii-kirjain tavalliseen tekstiin libreofficen writessä. Nettiä selaamalla ei oikein tunnu selviävän :(

https://www.linuxtopia.org/online_books/office_guides/openoffice_writer_user_guide/openoffice_guide_Greek_characters.html

kumpikaan ohjeen keinoista ei näytä toimivan. Koneessani on vakio Ubuntu 20.04.

Muokk.

Näköjään helpoin tapa yhden π :n saamiseksi on kopioida kirjain vaikka jostain nettisivulta.

https://www.greeksymbols.net/pi-symbol

Ei vaikuta kovin viralliselta, mutta riittänee kotikäyttöön :)


Muokk. 2

Oikea tapa on nm:n vastauksessa nuvottu Lisää --> Erikoismerkit ja sieltä valittu suosikkimerkkeihinkin kuuluva  π  Kiitos vastauksesta   :) 


152
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  :)

153
 
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 .....

154
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.





155

Niin taitaa olla. Nyt lomakkeen arvot siirtyvät selaimestakin.

Laitan tämän säikeen ratkaistuksi, otsikossahan on kysymystä vain kääntämisestä.

Kiitos kaikista vastauksista :)

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>


156
Nyt ohjelma kääntyi ja käynnistyi. sudo ldconfig taisi olla ratkaisu, mutta en kyllä vieläkään saanut järjestelmäkirjastomuuttujalle mitään arvoa echolla  ( ?? )

Käännetty ohjelma on tässä alla
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&);
     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;
}


Käännöskomento oli

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

Postdata näyttää löytyvän curlin kanssa

Koodia: [Valitse]
$ curl -X POST -F 'name=linuxize' -F 'data=ööö pp öö åååååååh' http://localhost:8080/hello

joka näkyy tällaisena

Koodia: [Valitse]
Data was: no data passed!!!
Now data is:ööö pp öö åååååååh

Mutta jos yritän html-sivulta postia lomakkeen kanssa

Koodia: [Valitse]


<!DOCTYPE html>
<html>
<body>

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

<form action=" http://localhost:8080/hello"  method="post">
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="fname"><br><br>
  <label for="data">Last data:</label>
  <input type="text" id="data" name="datatekstiä"><br><br>
 
  <button type="submit">Lähetä post</button>
  </form>
  </br> </br> </br> </br>
 
  <form action=" http://localhost:8080/hello"  method="get">
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="fname"><br><br>
  <label for="data">Last data:</label>
  <input type="text" id="data" name="datatekstiä"><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>




käännettypalvelin näyttää vain

Koodia: [Valitse]
Data was: no data passed!!!
Now data is:no data passed!!!

Hello world kyllä ilmestyy selaimeen aukeavaan ikkunaan. Selaimen kautta yritettäessä postin data ei näytä menevän perille, vaikka curlilla menee?


157
 Tiedosto on olemassa

Koodia: [Valitse]
$ find /usr/local/lib/ -name libhttpserver.so.0
/usr/local/lib/libhttpserver.so.0

Mutta

Koodia: [Valitse]
echo $LD_LIBRARY_PATH


eli onko järjestelmäkirjasto tyhjä. En ole aikaisemmin muokannut $LD_LIBRARY -asetuksia esim. exportilla. Netissä varoitettiin sen käyttämisestä. Voinko vain lisätä puuttuvan tiedoston järjestelmäkirjastomuuttujaan.

158
Nyt kokeiluohjelma näytti kääntyvän,

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

Mutta 

Koodia: [Valitse]
$ ./libhttpserver01
./libhttpserver01: error while loading shared libraries: libhttpserver.so.0: cannot open shared object file: No such file or directory


eli libhttpserver.so.0: -tiedostoa ei löydy. En ole vielä etsinyt sitä koneelta, olisiko se jossain, mistä käännös ei sitä löydä.

159
 Yritin Hello_worldin kääntämistä, mutta

Koodia: [Valitse]
$  g++ lbhttpser01.cpp -o lbhttpser01 -Wall -pedantic -L/usr/local/lib  -pthread -std=c++17
/usr/bin/ld: /tmp/ccTd04do.o: in function `hello_world_resource::render(httpserver::http_request const&)':
lbhttpser01.cpp:(.text+0xb6): undefined reference to `httpserver::http_request::get_arg(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const'
/usr/bin/ld: lbhttpser01.cpp:(.text+0x1e9): undefined reference to `httpserver::http::http_utils::text_plain'
/usr/bin/ld: /tmp/ccTd04do.o: in function `main':
lbhttpser01.cpp:(.text+0x41b): undefined reference to `httpserver::webserver::webserver(httpserver::create_webserver const&)'
/usr/bin/ld: lbhttpser01.cpp:(.text+0x487): undefined reference to `httpserver::webserver::register_resource(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, httpserver::http_resource*, bool)'
/usr/bin/ld: lbhttpser01.cpp:(.text+0x4b9): undefined reference to `httpserver::webserver::start(bool)'
/usr/bin/ld: lbhttpser01.cpp:(.text+0x4dc): undefined reference to `httpserver::webserver::~webserver()'
/usr/bin/ld: lbhttpser01.cpp:(.text+0x575): undefined reference to `httpserver::webserver::~webserver()' ..... jne

Olisiko tehnyt virheen (taas :(  ) siinä, että laitoin github kloonauksen alihakemistorakenteeseen näin
 
/home/k1/Documents/my_libhttpserver/libhttpserveri/libhttpserver/

ja

käännettävän ohjelman paikkaan

~/Documents/my_libhttpserver/kokeilut/

Virheimitushan voisi tarkoittaa, että oikeaa (viittaus)tiedostoa ei löydy mistään. Ehkä libhttpserverin asennuksessa käytetyt make ja make install olettavat jotain hakemistorakenteesta?

Hello_world on tässä alla  libhttpserver01.cpp -nimisenä.

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&);
     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;
}






160
Libbhttpserverin asennus on mahdollisesti onnistunut.   /home/k1/.bash_history -tiedostosta katsottuna on tarvittu tällaisia komentoja Ubuntu 20.04 -peruskoneella

Koodia: [Valitse]
sudo apt install  aclocal
sudo apt install automake
sudo apt install git
sudo apt install libtool
sudo apt install libmicrohttpd-dev
sudo apt install libgnutls28-dev
sudo apt autoremove
d /home/koti/Documents/koti_libhttpserver
git clone https://github.com/git-guides/git-clone
git config –global user.name "oma-git-tunnus"
mkdir git-noudot
cd git-noudot
git init
git remote add origin  https://github.com/oma-git-tunnus/.git/
git clone https://github.com/etr/libhttpserver
ls
cd libhttpserver
ls
./bootstrap
./configure
make

Yhtään kokeiluohjelmaa en vielä ole ehtinyt kääntää, mutta toivon parasta ja uskaltanen laittaa tämän asennussäikeen ratkaistuksi. Kiitos neuvoista :)

Sivuja: 1 ... 6 7 [8] 9 10 ... 41