Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: teele - 23.03.20 - klo:20.45
-
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
#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ä?
-
Ongelma lienee tässä:
httplib::SSLClient cli("nule.dy.fi", 80);
Älä käytä SSLClient-luokkaa, jos et käytä SSL:ää. Oikea luokka on varmaankin httplib::Client.
-
Luokka vaihdettu, mutta vielä pitäisi selvittää virhekoodi 500, ks. seuraavat kommentit
-
Mikä tarkalleen ottaen on http-muuttuja?
-
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ä
#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;
}
}
-
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?
-
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.
-
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.
-
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ä.
-
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
#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;
}
}
-
Virhe 500 tulee kuitenkin palvelimelta, eli Apachessa tai PHP-koodissa menee jokin pieleen. Kannattaa etsiä syytä niiden lokeista.
-
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
#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 :)