Ubuntu Suomen keskustelualueet

Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: Mistofelees - 09.02.23 - klo:14.13

Otsikko: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: Mistofelees - 09.02.23 - klo:14.13
Miten kutsua javascriptillä serverillä olevaa php-scriptiä ?

Minulla on nettisivu, jolta yritän lähettää dataa serverille php-scriptille.
Toimii nätisti Linux:n selaimilla.
Androidilta ei toimi.

Linuxilta toimii sekä fetch, että xmlhttp.open -rakenteilla:
    mj="V0/'10:24'"
    response= fetch("http://tupu.neva/rele/talleta.php?val="+mj

sekä
    xmlhttp.open("GET", "http://tupu.neva/rele/talleta.php?val="+mj, true);
    xmlhttp.send();


Androidista käskien php-scripti ei edes käynnisty. (Scriptissä osa, joka tallettaa markkerin scriptin käynnistyessä.)
Sivusto on puhdasta html + Ajax-koodia, koska en ole vielä ehtinyt perehtyä 'parempiin' työkaluihin.
Serveri on samassa sisäverkossa kännnykän ja läppärin kanssa.

Haaskannut tämän kanssa kaksi päivää. Alkaa keittää.
Otsikko: Vs: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: _Pete_ - 10.02.23 - klo:08.14
Katso sen android kielen/frameworkin ohjeista miten kuuluu tehdä http-request.
Otsikko: Vs: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: nm - 10.02.23 - klo:09.43
Linuxilta toimii sekä fetch, että xmlhttp.open -rakenteilla:
    mj="V0/'10:24'"
    response= fetch("http://tupu.neva/rele/talleta.php?val="+mj

sekä
    xmlhttp.open("GET", "http://tupu.neva/rele/talleta.php?val="+mj, true);
    xmlhttp.send();

Tuossa koodissa pistää silmään, että hakuparametria ei enkoodata oikein URL-muotoon. Siihen kannattaa käyttää URLSearchParams-konstruktoria:

https://stackoverflow.com/a/58437909

Koodia: [Valitse]
response = fetch('http://tupu.neva/rele/talleta.php?' + new URLSearchParams({
    val: "V0/'10:24'",
}))


Androidista käskien php-scripti ei edes käynnisty. (Scriptissä osa, joka tallettaa markkerin scriptin käynnistyessä.)

Voi hyvinkin johtua virheellisestä URL:stä ja sen aiheuttamasta erosta selainten toiminnassa. Kokeile uudelleen oikein enkoodatulla parametrilla.

Jos ei auta, katso HTTP-palvelimen lokista, mihin Androidin lähettämä GET-pyyntö päätyy.
Otsikko: Vs: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: Mistofelees - 10.02.23 - klo:14.22
Kiitos. Pitää kokeilla tuota koodausta.

Kuitenkin tuo käsin generoitu osoiterivi noudattaa  minusta standardeja.
Toimii kiltisti Linuxin ja Windowsin selaimilla, mutta ei Androidin ja iBadin.
Otsikko: Vs: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: nm - 10.02.23 - klo:17.27
Kuitenkin tuo käsin generoitu osoiterivi noudattaa  minusta standardeja.

Parametrin merkit "/", "'" ja ":" on enkoodattava. Muuten selain saattaa hyvinkin hylätä pyynnön jo ennen lähettämistä, tai web-palvelin saattaa ymmärtää polun eri tavalla kuin olet ajatellut, eli pyyntö ei kohdistu php-skriptiin vaan hakemistossa /rele/talleta.php?val=V0/ sijaitsevaan tiedostoon 10:24

JavaScriptin puolella eroa voi tarkastella vaikka tällaisella koodinpätkällä:
https://jsfiddle.net/gzj4sukw/

Koodia: [Valitse]
mj="V0/'10:24'"

url="http://tupu.neva/rele/talleta.php?val="+mj
console.log(url)

encoded="http://tupu.neva/rele/talleta.php?" + new URLSearchParams({val: mj})
console.log(encoded)

Konsoliloki:
Koodia: [Valitse]
"http://tupu.neva/rele/talleta.php?val=V0/'10:24'"
"http://tupu.neva/rele/talleta.php?val=V0%2F%2710%3A24%27"


Toimii kiltisti Linuxin ja Windowsin selaimilla, mutta ei Androidin ja iBadin.

Yhteydessä voi tietty olla muutakin ongelmaa, mutta jos sivusto toimii Androidissa ja iPadissa muilta osin, ja vain fetch/xmlhttprequest epäonnistuu, kyseisessä pyynnössä on jotain vikaa.

Yleensä tällaisia ongelmia kannattaa lähteä selvittämään web-palvelimen lokin ja selaimen kehittäjätyökalujen avulla. Androidin Chromeen ainakin saa kehittäjätyökalut lisäosana.
Otsikko: Vs: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: Mistofelees - 10.02.23 - klo:21.48
SUURKIITOS kanssakärsijät  :)
Sain uutta puhtia ja ideaa noista kirjoituksistanne.
Apache2:n error-logista löytyi muitakin aiheita korjauksiin.

Korvasin välitettävästä merkkijonosta kaikki erikoismerkit helpommilla ja yksinkertaistin viestiä.
Tein vastaavat muutokset php -scriptiin.
NYT TOIMII !!

Toimiva rakenne ajax-koodissa: (Yksinkertaistettuna)
Koodia: [Valitse]
paikka="K01"
TT="10:50"
mj=paikka+TT
    response= fetch("talleta.php?val="+mj)
Vastaanottavassa päässä talleta.php:ssä:
Koodia: [Valitse]
$gj=$_GET['val'];
Tämä on osa nettisivua, jolla annetaan aktivointiajat rakentamilleni esp8266-ohjatuille releille. Tällä hetkellä releitä on kolme koekäytössä, mutta pöydällä odottaa neljä lisää.
Otsikko: Vs: php scriptin kutsuminen Androidista Ajaxilla
Kirjoitti: Mistofelees - 11.02.23 - klo:11.53
Ei tämä tähän loppunut.
Ongelma ratkesi kahdella puhelimella.
Kolmas puhelin ei suostunut hakemaan muuttuneita arvoja serveriltä, joten luulin sen kärsivän aiemmin kuvaamastani viasta.
Netistä löytyi kuitenkin ohjeet nettisivun lataamiseen cachen ohi ja tämä auttoi.
Pistin html-sivun headeriin seuraavat loitsut sen enempiä miettimättä:

Koodia: [Valitse]
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="0">

LISÄYS MYÖHEMMIN:
Ei auttaneet netin ohjeet eikä muutaman AJA-kirjan lukeminen.
Lopulta ratkaisu löytyi vahingossa.
Android ei tykkää, jos samalla HTML-sivulla on kaksi < script xxxxxxxxx > -kutsua. Toinen latautuu vain satunnaisesti.
Syytä en viitsi alkaa etsiä.
Yhdistelin scriptejä ja muutin toimintoja. Nyt on toiminut jo muutamia päiviä.
Ohje löytyi netistä sivulta, jolla ongelman ratkaisua on esitelty paremminkin: