Kirjoittaja Aihe: [ ratkaistu ] cpp-httplib ja tavallisen http muuttujan päivitys  (Luettu 4787 kertaa)

teele

  • Käyttäjä
  • Viestejä: 851
    • Profiili
Hieaman aikaisemmin olevassa säikeessä on cpp-httblibin käyttö https muuttujan päivittämisessä, ja se toimii hienosti.

Jos suunnilleen samanlaista koodia voisi käyttää myös tavallisen http muuttujan päivittämiseen, asiat tulisivat aika yksinkertaiseksi. Netistä ei ole toistaiseksi löytynyt kuin yksi asiaa koskeva ohje eikä sekään näytä toimivan.

Tällaista on kokeiltu tavallisen http muttujan päivitykseen

Koodia: [Valitse]
#include <iostream>
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include  "/home/oma/Documents/my_httplib/cpp-httplib-master/httplib.h"

int main(void)
{
/*
  const char *cert_dir = getenv(X509_get_default_cert_dir_env());

  if (!cert_dir) cert_dir = X509_get_default_cert_dir();

  std::string cert_path = cert_dir;
  cert_path += "/ca-certificates.crt";
  std::cout << "SSL certificate path: " << cert_path << std::endl;

  httplib::SSLClient cli("nule.dy.fi", 443);
  cli.set_ca_cert_path(cert_path.c_str());
  cli.enable_server_certificate_verification(true);
*/

  httplib::SSLClient cli("nule.dy.fi", 80);

  httplib::Params params;
  //params.emplace("x", "1234 ");
  //params.emplace("y", "3333");

  //auto res = cli.Post("/testihakemisto/sf02.php", params);
  auto res = cli.Post("/testihakemisto/sf02.php", "x=50511", "application/x-www-form-urlencoded");

  if(res)
  {
    std::cout << "Status: " << res->status << std::endl;
  }
  else
  {
    std::cout << "POST failed" << std::endl;
  }

}

Ohjelma kääntyy, mutta päättyy ilmoitukseen  POST failed, koska cli.Post ei onnistu.

cli.Post -kutsumuoto on täältä

https://stackoverflow.com/questions/52274981/post-request-with-cpp-httplib

Ohjelmasta on siis vain jätetty salausasiat pois ja vaihdettu portti 80 :ksi verrattuna hyvin toimivaan https-versioon.

Mitä korjauksia pitäisi tehdä?


« Viimeksi muokattu: 24.03.20 - klo:15.51 kirjoittanut teele »

Tomin

  • Palvelimen ylläpitäjä
  • Käyttäjä / moderaattori+
  • Viestejä: 11481
    • Profiili
    • Tomin kotisivut
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #1 : 23.03.20 - klo:20.50 »
Ongelma lienee tässä:
Koodia: [Valitse]
  httplib::SSLClient cli("nule.dy.fi", 80);

Älä käytä SSLClient-luokkaa, jos et käytä SSL:ää. Oikea luokka on varmaankin httplib::Client.
Automaattinen allekirjoitus:
Lisäisitkö [RATKAISTU] ketjun ensimmäisen viestin aiheeseen ongelman ratkettua, kiitos.

teele

  • Käyttäjä
  • Viestejä: 851
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #2 : 23.03.20 - klo:20.59 »
Luokka vaihdettu, mutta vielä pitäisi selvittää virhekoodi 500, ks. seuraavat kommentit
« Viimeksi muokattu: 24.03.20 - klo:10.38 kirjoittanut teele »

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Mikä tarkalleen ottaen on http-muuttuja?

teele

  • Käyttäjä
  • Viestejä: 851
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #4 : 24.03.20 - klo:10.35 »
Taisin iloita liian aikaisin, en huomannut, että paluukoodin 200 sijasta tulikin paluukoodi 500 ja php-muutujan arvo ei muuttunutkaan.

Ohjelma kääntyy hyvin ilman mitään ilmoituksia. Domaini toimii selaimella katsottaessa. Valitettavasti virhe 500 palvelimelta näyttää olevan yleisvirhe eli virhenumeron perusteella ei ole saatavissa lisätietoa.

cli.Post -kutsumuoto on kopioitu täältä

https://stackoverflow.com/questions/52274981/post-request-with-cpp-httplib

http-muuttuja on huona kieltä. Tässä sillä tarkoitettiin http-muotoisella pyynnöllä palvelinscriptille lähetettyä käskyä muuttaa muuttujan x arvoa php-sivulla. Asia liittyi hieman aikaisemman keskustelusäikeen kysymykseen, jossa tietoa palvelimelle välitettiin salatussa https-muodossa.

Mutta kysymys on tosiaan vielä auki, eikä virhekoodista 500 ole vielä ollut paljon apua.

Koko ohjelma on tässä

Koodia: [Valitse]
#include <iostream>
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include  "/home/oma/Documents/my_httplib/cpp-httplib-master/httplib.h"

int main(void)
{

  httplib::Client cli("omadomaini1.dy.fi", 80);

  httplib::Params params;
  auto res = cli.Post("/testihakemisto/sf02.php", "x=123456 78", "application/x-www-form-urlencoded");

  if(res)
  {
    std::cout << "Status: " << res->status << std::endl;
  }
  else
  {
    std::cout << "POST failed" << std::endl;
  }

}




« Viimeksi muokattu: 24.03.20 - klo:13.37 kirjoittanut teele »

_Pete_

  • Käyttäjä
  • Viestejä: 1845
  • Fufufuuffuuu
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #5 : 24.03.20 - klo:13.15 »
Mitä on tarkoitus saada aikaiseksi tällä php muuttujan arvon asettamisella kun php sivua kutsutaan?

koodissasi  on:

x=123456 78


Onko siis tarkoitus se että kun php scripti ajetaan niin x sisältämä arvo asetetaan php oman sisäisen muuttujan arvoksi ja sillä tehdään jotain?


teele

  • Käyttäjä
  • Viestejä: 851
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #6 : 24.03.20 - klo:13.34 »
Juuri niin on tarkoitus, $_POST -taulukosta katsotaan x-arvo, ja tehdään sen kanssa jotain. x on string php-puolella eli se voi olla tässä kokeilussa suunnileen mitä vain, vaikka tekstirivi.

Ongelmana on, että en ole osannut tehdä oikeanmuotoista pyyntöä cpp-httplib -koodin kanssa ja tulee virhe 500 palvelimelta. Vastaavanlainen pyyntö toimii suoraan socketeilla tehtynä tai cpp-httplibillä https-muotoisena.

cpp-httplib-koodi on niin kätevän tuntuista, että olisi hienoa, jos sen saisi toimimaan myös tässä tapauksessa. Vanhaa socket-koodia piti kirjoitella paljon enemmän.
« Viimeksi muokattu: 24.03.20 - klo:13.36 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #7 : 24.03.20 - klo:14.04 »
Välilyönti pitää todennäköisesti korvata merkkijonolla %20
https://en.wikipedia.org/wiki/Percent-encoding#Character_data

Kannattaa mieluummin käyttää sitä cpp-httplibin Params-luokkaa, niin et joudu muuntamaan erikoismerkkejä itse.


Ongelma voi tosin olla myös PHP-koodissa, jos se vaikka yrittää tulkita x:n numeerisena arvona ja epäonnistuu välilyönnin vuoksi. Selvinnee palvelimen lokista.
« Viimeksi muokattu: 24.03.20 - klo:14.06 kirjoittanut nm »

kamara

  • Käyttäjä
  • Viestejä: 3028
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #8 : 24.03.20 - klo:14.29 »
Välilyönti pitää todennäköisesti korvata merkkijonolla %20
https://en.wikipedia.org/wiki/Percent-encoding#Character_data

Jos sekään ei toimi, niin välilyönniksi voi kokeilla myös +-merkkiä.

teele

  • Käyttäjä
  • Viestejä: 851
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #9 : 24.03.20 - klo:14.34 »
Aluksi kokeilin myös tavallisella numerosarjalla 5511 tai jotain sellaista, ja nyt poistin välilyönnin ja käänsin uudestaan, mutta virhekoodi on vieläkin 500.

Ihan aluksi kokeilin muistaakseni parametri-luokan kanssa, mutta se ei näyttänyt toimivan, joten pengoin netistä sen stackoverflow ohjeen.

Muistaakseni tavllisessa socket-pyynnössä ja https-muotoisessa pyynnössä välilyönnit eivät haittaa ja x:n arvo on joskus ollut aaaa bbbb cccc ja se on tulostunut selaimella ihan oikein.

Varmistin vielä parametriluokan kanssa

Koodia: [Valitse]
#include <iostream>
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include  "/home/oma/Documents/my_httplib/cpp-httplib-master/httplib.h"

int main(void)
{

  httplib::Client cli("omadomaini1.dy.fi", 80);

  //auto res = cli.Post("/testihakemisto/sf02.php", "x=12345678", "application/x-www-form-urlencoded");

  httplib::Params params;
  params.emplace("x", "1234 ");
  params.emplace("y", "3333");

  auto res = cli.Post("/testihakemisto/sf02.php", params);



  if(res)
  {
    std::cout << "Status: " << res->status << std::endl;
  }
  else
  {
    std::cout << "POST failed" << std::endl;
  }

}




« Viimeksi muokattu: 24.03.20 - klo:14.43 kirjoittanut teele »

nm

  • Käyttäjä
  • Viestejä: 16425
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #10 : 24.03.20 - klo:14.52 »
Virhe 500 tulee kuitenkin palvelimelta, eli Apachessa tai PHP-koodissa menee jokin pieleen. Kannattaa etsiä syytä niiden lokeista.

teele

  • Käyttäjä
  • Viestejä: 851
    • Profiili
Vs: cpp-httplib ja tavallisen http muuttujan päivitys
« Vastaus #11 : 24.03.20 - klo:15.43 »
php-puolelta puuttui 1 sulku, nyt näyttää menevän läpi pyyntö, jolla x saa esimekiksi arvon "aa 11111"

Onnistuuko kokpnaisen rivin lähettäminen, on vielä epävarmaa, ainakaan nopeat kokeilut eivät näyttäneet onnistuvan, mutta yksi arvo x:lle riittää, oli vain vähän kokeilumieltä, kun taas näyttää toimivan.

Lyhyin muoto ilman parametriluokkaa ohjelmasta on nyt ollut tällainen

Koodia: [Valitse]
#include <iostream>
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include  "/home/oma/Documents/my_httplib/cpp-httplib-master/httplib.h"

int main(void)
{
  httplib::Client cli("omadomaini1.dy.fi", 80);

  auto res = cli.Post("/testihakemisto/sf02.php", "x=123456 77", "application/x-www-form-urlencoded");

  if(res)
  {
    std::cout << "Status: " << res->status << std::endl;
  }
  else
  {
    std::cout << "POST failed" << std::endl;
  }
}


Ehkä säikeen voi nyt laittaa hyvällä omallatunnolla ratkaistuksi, en varmaan ilman kehoitusta olisi alkanut php-puolta tutkimaan.

Kiitos neuvoista  :)