// // client: // $method = "POST"; $url = "http://www.../.../test/persone/"; $body = "nome=Anna&cognome=Sala&luogo=Verona&data=10/10/82"; $n = substr_count($body, "="); // il numero delle variabili presenti nella stringa body è misurato attraverso il numero degli "=" $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, $n); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); print($result);Il web-service:
INSERT INTO persone (nome, cognome, luogo, data) VALUES ('Anna', 'Sala', 'Verona', '10/10/82');
Nei metodi GET e DELETE è inutile passare il body (non è un errore ma non serve a niente), sono sufficienti il metodo e l'indirizzo (nel caso del GET nella forma ?var1=10&var2=12
//
// client/request.php
//
$method = "GET";
$url = "localhost/webservice/persone/?id=1";
$body = "";
//
// client/index.php
//
class Client
{
private $url;
private $method;
private $body;
private $num;
public function __construct($method, $url, $body)
{
$this->url = $url;
$this->method = $method;
$this->body = $body;
$this->num = substr_count($this->body, "=");
}
private function createTable()
{
// conn
$conn = new mysqli("localhost", "root", "", "webservice");
if($conn->connect_error){die("Connection failed: " . $conn->connect_error);}
// table
$sql = "CREATE TABLE persone (id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,numero varchar(64),cognome varchar(64),nome varchar(64),nato_il varchar(10),atto varchar(64),a varchar(64),cittadinanza varchar(64),residenza varchar(64),via varchar(64),stato_civile varchar(64),professione varchar(64),statura varchar(3),capelli varchar(64),occhi varchar(64),segni_particolari varchar(64),data varchar(10),scadenza varchar(10));";
if($conn->query($sql) === TRUE){echo "OK";}else{echo "Error: " . $conn->error;}
// insert
$sql = "INSERT INTO persone (numero,cognome,nome,nato_il,atto,a,cittadinanza,residenza,via,stato_civile,professione,statura,capelli,occhi,segni_particolari,data,scadenza) VALUES ('QW1578923','Esposito','Vincenzo','17/06/1996','1/56/A1996','Salerno','Italiana','Salerno','via Dalmazia 15','stato libero','omesso','175','castani','castani','','22/04/2016','22/02/2027')";
if($conn->query($sql) === TRUE){echo "OK";}else{echo "Error: " . $conn->error;}
$sql = "INSERT INTO persone (numero,cognome,nome,nato_il,atto,a,cittadinanza,residenza,via,stato_civile,professione,statura,capelli,occhi,segni_particolari,data,scadenza) VALUES ('AE1578651','Rossi','Antonio','27/03/1971','105/5/s71','Roma','italiana','Roma','via xx settembre 19','sposato','impiegato','169','neri','scuri','','02/08/2015','02/06/2026')";
if($conn->query($sql) === TRUE){echo "OK";}else{echo "Error: " . $conn->error;}
$sql = "INSERT INTO persone (numero,cognome,nome,nato_il,atto,a,cittadinanza,residenza,via,stato_civile,professione,statura,capelli,occhi,segni_particolari,data,scadenza) VALUES ('WE1231244','Sala','Mario','23/12/1980','12/3332','Verona','italiana','Verona','via Veneto 15','stato libero','omesso','179','castani','marroni','','13/10/2000','13/10/2010')";
if($conn->query($sql) === TRUE){echo "OK";}else{echo "Error: " . $conn->error;}
//
$conn->close();
}
private function deleteTable()
{
$conn = new mysqli("localhost", "root", "", "webservice");
if($conn->connect_error){die("Connection failed: " . $conn->connect_error);}
$sql = "DROP TABLE persone;";
if($conn->query($sql) === TRUE){echo "OK";}else{echo "Error: " . $conn->error;}
$conn->close();
}
public function reset()
{
$this->deleteTable();
$this->createTable();
}
private function run()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_POST, $this->num);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->method);
if($this->body)
{
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->body);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
$json = json_decode($result, true);
print($result);
}
}
include ("request.php");
$q = new Client($method, $url, $body);
$q->run();
Il file request.php contiene le 3 variabili della request: il metodo, l'indirizzo e il corpo.
//
// persone/db.php
//
class Database
{
public $conn;
private $servername;
private $username;
private $password;
private $db;
private $table;
public $column;
function __construct($servername, $username, $password)
{
$this->servername = $servername;
$this->username = $username;
$this->password = $password;
}
public function connection()
{
$this->conn = new mysqli($this->servername, $this->username, $this->password, $this->db);
if($this->conn->connect_error)
{
die("Connection failed: " . $this->conn->connect_error);
}
}
public function setDatabase($db)
{
$this->db = $db;
$this->conn->select_db($db);
}
public function setTable($table)
{
$this->table = $table;
$this->column = $this->getColumnNames();
}
public function query($sql)
{
$result = $this->conn->query($sql);
if(!$result)
{
die("Connection failed: " . $this->conn->error);
}
return $result;
}
public function select($where)
{
if(!$where){$where = "1";}
$sql = "SELECT * FROM $this->table WHERE $where;";
return $this->query($sql)->fetch_all(MYSQLI_ASSOC);
}
public function insert($columns, $values)
{
$sql = "INSERT INTO $this->table ($columns) VALUES ($values);";
return $this->query($sql);
}
public function update($set, $where)
{
$sql = "UPDATE $this->table SET $set WHERE $where;";
return $this->query($sql);
}
public function delete($where)
{
$sql = "DELETE FROM $this->table WHERE $where;";
return $this->query($sql);
}
public function getColumns()
{
$sql = "SHOW COLUMNS FROM $this->table";
$result = $this->query($sql);
return $result->num_rows;
}
public function getColumnNames()
{
$res = $this->query("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '" . $this->db . "' AND TABLE_NAME = '" . $this->table . "';");
while($row = $res->fetch_assoc())
{
$result[] = $row;
}
return array_column($result, 'COLUMN_NAME');
}
public function close()
{
$this->conn->close();
}
}
Non c'è molto da dire. Il file db.php contiene i metodi per la connessione al database e per l'esecuzione delle operazioni CRUD.
//
// persone/index.php
//
include("db.php");
class Server
{
private $method;
private $uri;
private $body;
private $conn;
private $db;
private $table;
private $path = array();
public function __construct()
{
$this->method = $_SERVER['REQUEST_METHOD'];
$this->uri = $_SERVER['REQUEST_URI'];
$this->body = file_get_contents('php://input');
$this->dir();
$this->fun();
}
private function dir()
{
$this->path = array_values(array_filter(explode("/", parse_url($this->uri, PHP_URL_PATH))));
$this->db = $this->path[0]; // database
$this->table = $this->path[1]; // table
$this->query = parse_url($this->uri, PHP_URL_QUERY); // query
}
private function connection()
{
$this->conn = new Database("localhost", "root", "", $this->db);
$this->conn->connection();
$this->conn->setDatabase($this->db);
$this->conn->setTable($this->table);
}
private function close()
{
$this->conn->close();
}
private function fun()
{
$this->connection();
$data = "";
if($this->method === "GET")
{
$where = "1";
if(strlen($this->query) > 0)
{
$where = str_replace("&", " AND ", $this->query); // trasforma il path in where
}
$data = $this->conn->select($where);
}
else if($this->method === "POST")
{
if(strlen($this->query) == 0) // empty path
{
$columns = "";
$values = "";
foreach($_POST as $key => $val)
{
$columns .= $key . ",";
$values .= "'" . $val . "',";
}
$columns = substr($columns, 0, -1);
$values = substr($values, 0, -1);
$this->conn->insert($columns, $values);
$data = "{\"result\": \"ok\"}";
}
else // error
{
$data = "{\"result\": \"error\"}";
}
}
else if($this->method === "PUT")
{
if(count($this->path) > 2)
{
$where = $this->path[2] . "='" . $this->path[3] . "'";
$set = str_replace("&", ",", $this->body);
$this->conn->update($set, $where);
$data = "{\"result\": \"ok\"}";
}
else
{
$data = "{\"result\": \"error\"}";
}
}
else if($this->method === "DELETE")
{
if(count($this->path) > 2)
{
$where = $this->path[2] . "='" . $this->path[3] . "'";
$this->conn->delete($where);
$data = "{\"result\": \"ok\"}";
}
else
{
$data = "{\"result\": \"error\"}";
}
}
else
{
$data = "{\"result\": \"error\"}";
}
$this->close();
$this->ok($data);
}
private function ok($data)
{
http_response_code(200);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data); // return json
}
private function error()
{
http_response_code(404);
include("../404.php");
die();
}
}
new Server();
Il costruttore estrae il metodo, l'indirizzo e il corpo della richiesta. Quindi scompone ulteriormente l'url per ricavarne i vari segmenti (nome del database, nome della tabella e la query).Mi chiamo Cosimo Saccone e sono un programmatore napoletano di 44 anni con oltre 35 anni di esperienza nella programmazione (BASIC, Assembly). Realizzo progetti e programmi utilizzando i principali e più diffusi linguaggi (C, C++, PHP, Javascript, HTML) e software per la grafica (Photoshop, Illustrator, 3dsMax). Anche se la grafica rappresenta il mio principale settore di interesse, non disdegno il lavoro di back-end e di organizzazione dati e sono attento agli aspetti di efficienza e di risparmio delle risorse tipica della programmazione di basso livello (specie nel settore della grafica 3d). Realizzo siti internet, applicativi desktop e servizi di vario tipo. Ho una buona conoscenza della libreria OpenGL per lo sviluppo di applicazioni 3d interattive in C/C++. Cerco di adottare uno stile di programmazione fortemente ordinato e modulare. Possiedo, inoltre, una buona capacità di elaborazione della documentazione. Ho vari hobbies tra cui la pittura, la ginnastica e le lunghe passeggiate in solitudine.
Al fine di migliorare l’esperienza di navigazione sul nostro sito noi di cosimosaccone.com e i nostri partner selezionati elaboriamo i dati personali, compreso l’indirizzo IP e le pagine visitate, in relazione alla tua navigazione nei contenuti del sito, per i seguenti scopi:
Accesso alle informazioni
Dati precisi di geolocalizzazione
Misurazione del pubblico
Pubblicità e contenuti personalizzati
Ti ricordiamo che il termine cookie si riferisce a una porzione di dati inviati al tuo browser da un web server. Il cookie viene memorizzato sul tuo dispositivo e riconosciuto dal sito web che lo ha inviato in ogni navigazione successiva. Se vuoi saperne di più e compiere una scelta diversa, come il rifiuto del trattamento dei tuoi dati personali, clicca qui sulla nostra privacy policy. Potrai sempre modificare le tue scelte e impostare i singolo cookies selezionando il bottone qui sotto.
OK