Italian Da get a post

Schakalaka

Active Member
Licensed User
Longtime User
ciao a tutti,
rivedendo la mia app, mi sono accorto di aver scritto tutti i job http con metodo GET, anche quando avrei dovuto utilizzare POST.
Utilizzo b4a, mysql e php.

in b4a, questo è quanto utilizzato per inviare le richieste di scrittura dati:

B4X:
        Dim j As HttpJob
        j.Initialize("update_mysql_data", Me)
        j.download2(functions.serverURL & "/clickandclaim-host/claim-api.php", Array As String ("action", "upfmToken", "mydeviceid",my_deviceid,"thisfmtoken",tokentxt))
        '                /clickandclaim-host/claim-api.php?action=upfmToken&mydeviceid=76gxh1psxp&myfmtoken=15
        ProgressDialogShow("uploading data...")
        Wait For (j) JobDone(j As HttpJob)
        If j.Success Then

            Log("data updated")

        Else
            ToastMessageShow("Error: " & j.ErrorMessage, True)
 
        End If
        j.Release
        ProgressDialogHide

Mente nel file php la gestisco con

B4X:
$con = mysqli_connect($host, $user, $pw, $db) or die(mysqli_error($con));
mysqli_set_charset($con, "utf8");


@$action = $_GET["action"];

    switch ($action) {
   case "update_mysql_data":
    $txtdeviceid = mysqli_real_escape_string($con, $_GET["deviceid"]);
    $txtfriendcode = mysqli_real_escape_string($con, $_GET["friendcode"]);
    $txtmyenergy = mysqli_real_escape_string($con, $_GET["this_energy"]);
    $txtmybalance = mysqli_real_escape_string($con, $_GET["this_balance"]);
    $txttotalbalancevalue = mysqli_real_escape_string($con, $_GET["this_totalbalance"]);
    $txtclickvalue = mysqli_real_escape_string($con, $_GET["this_totalclick"]);
    $txtmtexp = mysqli_real_escape_string($con, $_GET["this_exp"]);
    $txtfriendbox = mysqli_real_escape_string($con, $_GET["friendbox"]);
    $txttotfriendbox = mysqli_real_escape_string($con, $_GET["ref_totfriendbox"]);

    $query = "UPDATE tbl_users SET
                my_energy = '$txtmyenergy',
                my_balance = '$txtmybalance',
                my_totbalance = '$txttotalbalancevalue',
                my_totclick = '$txtclickvalue',
                my_exp = '$txtmtexp'
              WHERE my_deviceid = '$txtdeviceid' ";
    $result = mysqli_query($con, $query);

    if ($result) {
        $query2 = "UPDATE tbl_users SET
                     my_friendbox = '$txtfriendbox',
                     my_totfriendbox = '$txttotfriendbox'
                   WHERE my_referalcode = '$txtfriendcode'";
        $result2 = mysqli_query($con, $query2);

        if ($result2) {
            print json_encode("Inserted");
        } else {
            die('Errore MySQL: ' . mysqli_error($con));
        }
    } else {
        die('Errore MySQL: ' . mysqli_error($con));
    }
    break;

}


?>

che restituisce un json

Come posso cambiare questo codice per utilizzare il metodo POST?
Grazie
 

Lucas Siqueira

Active Member
Licensed User
Longtime User
La differenza principale tra GET e POST è che in POST puoi passare i dati attraverso il corpo della richiesta (body).
In molte API vengono utilizzati i dati JSON:
normalmente utilizziamo GET per query, POST per inserimento o modifica, PUT e PATCH per modifica, DELETE per cancellazione.

B4X:
     '#### consult
    Dim job As HttpJob
    job.Initialize("", Me)
    job.Download("https://urlYourServer/testeApi.php?action=consult")
    Wait For (job) JobDone(job As HttpJob)
    If job.Success Then
        Log(job.GetString)
      
    End If
    job.Release
   
   
    '#### insert
    Dim job As HttpJob
    job.Initialize("", Me)
    Dim payload As Map = CreateMap("nome": "JOAO", "data_nascimento": "2024-01-31")
    Dim json As String = payload.As(JSON).ToString 'make sure that the json library is checked
    job.PostString("https://urlYourServer/testeApi.php?action=insert", json)
    job.GetRequest.SetContentType("application/json")
    Wait For (job) JobDone (job As HttpJob)
    If job.Success Then
        'assuming that the response is json:
        Dim response As Map = job.GetString.As(JSON).ToMap
        Log(response)
       
    End If
    job.Release
   
   
     '####  update
    Dim job As HttpJob
    job.Initialize("", Me)
    Dim payload As Map = CreateMap("id":"1", "nome": "JOAO", "data_nascimento": "2024-01-31")
    Dim json As String = payload.As(JSON).ToString 'make sure that the json library is checked
    job.PostString("https://urlYourServer/testeApi.php?action=update", json)
    job.GetRequest.SetContentType("application/json")
    Wait For (job) JobDone (job As HttpJob)
    If job.Success Then
        'assuming that the response is json:
        Dim response As Map = job.GetString.As(JSON).ToMap
        Log(response)
       
    End If
    job.Release



puoi usarlo in PHP
PHP:
<?php
$host = "localhost";
$db = "testedb";
$user ="root";
$pw = "askhdkjh";

$con = mysqli_connect($host, $user, $pw, $db);
mysqli_set_charset($con, "utf8");

if (mysqli_connect_errno()) {
    $retorno = array("success"=>false, "error"=>"Failed to connect to MySQL: " . mysqli_connect_error());
    die(json_encode($retorno));
}

$action = $_GET["action"];

$request = file_get_contents('php://input');
$request = json_decode($request,true);

switch ($action) {

    case "consult":
    $query = "select * from teste";  
    if ($result = mysqli_query($con, $query)) {
        $retorno = array("success"=>true, "rows"=>mysqli_num_rows($result), "result"=>mysqli_fetch_all($result, MYSQLI_ASSOC));
    } else {
        $retorno = array("success"=>true, "rows"=>0, "result"=>"[]");  
    }
    die(json_encode($retorno));
    break;


    case "insert":
    $nome = mysqli_real_escape_string($con, $request["nome"]);
    $data_nascimento = mysqli_real_escape_string($con, $request["data_nascimento"]);
    $query = "insert into teste (nome,data_nascimento) values ('$nome','$data_nascimento')";
    if ($result = mysqli_query($con, $query)) {
        $retorno = array("success"=>true, "msg"=>"Inserted", "id"=>mysqli_insert_id($con));
    } else {
        $retorno = array("success"=>false, "error"=>"Failed insert: " . mysqli_error($con));
    }
    die(json_encode($retorno));
    break;


    case "update":
    $id = mysqli_real_escape_string($con, $request["id"]);
    $nome = mysqli_real_escape_string($con, $request["nome"]);
    $data_nascimento = mysqli_real_escape_string($con, $request["data_nascimento"]);
    $query = "update teste SET
    nome = '$nome',
    data_nascimento = '$data_nascimento'
    where id='$id'";
    if ($result = mysqli_query($con, $query)) {
        $retorno = array("success"=>true, "msg"=>"Updated");
    } else {
        $retorno = array("success"=>false, "error"=>"Failed update: " . mysqli_error($con));
    }
    die(json_encode($retorno));
    break;

  
    default:
    $retorno = array("success"=>false, "error"=>"action not accepted");
    die(json_encode($retorno));
    break;

}
die();
?>


Ho testato le richieste in insonnia:

devi sempre passare il parametro dell'azione tramite GET

1710417083744.png




Richiesta tramite POST con inserimento di azioni
1710417204871.png



Richiesta tramite POST di modifica del record
1710417257164.png
 
Last edited:
Top