Σε αυτό το άρθρο, μαθαίνουμε πώς να δημιουργήσουμε δυναμικά Web API χρησιμοποιώντας PHP. Γιατί PHP; Η PHP είναι μια πολύ δημοφιλής γλώσσα προγραμματισμού που χρησιμοποιείται για την απόδοση ιστοσελίδων από την πλευρά του διακομιστή και περιλαμβάνεται ως τυπική επιλογή με πολλούς παρόχους φιλοξενίας Ιστού, συμπεριλαμβανομένου του HostGator (ο πάροχος μου). Είχα την ανάγκη να δημιουργήσω προσομοιωμένα δεδομένα IoT διάρκειας ενός λεπτού για ένα πρόσφατο άρθρο που έγραψα σχετικά με την Ανάκτηση, το φιλτράρισμα και την ταξινόμηση των API JSON στα Φύλλα Google: Οι λειτουργίες που λείπουν. Προς μεγάλη μου έκπληξη και χαρά, η PHP είναι ταυτόχρονα ισχυρή και διασκεδαστική, και είμαι εδώ για να μοιραστώ μερικές από τις γνώσεις μου μαζί σας. Ας ξεκινήσουμε και ας επισημάνουμε τρεις τρόπους για τη δημιουργία δυναμικών API Ιστού χρησιμοποιώντας PHP.
Περιεχόμενα άρθρου
Τι είναι το Dynamic Web API;
Για τους σκοπούς αυτού του άρθρου, ορίζω ένα δυναμικό web API ως μια διεπαφή προγραμματισμού εφαρμογών (API) που επιτρέπει σε μια εφαρμογή να „θέτει ερωτήσεις“ μέσω ενός αιτήματος HTTP και να λαμβάνει απαντήσεις μέσω μιας απόκρισης HTTP. Η απόκριση HTTP στο περιβάλλον μας μεταδίδεται χρησιμοποιώντας JSON, αλλά θα μπορούσε επίσης να είναι XML ή κάποια άλλη δομημένη μορφή.
Στόχος μου ήταν να λαμβάνω (προσομοιωμένα) δεδομένα σε πραγματικό χρόνο για τη θερμοκρασία του νερού σε μια δεξαμενή ψαριών στην ακόλουθη μορφή JSON:
{
"Tank": "Tank1",
"watertemp": {
"time": "2019-05-11 22:20 GMT",
"value": 72.5
}
}
Τα χαρακτηριστικά JSON „time“ και „value“ πρέπει να ενημερώνονται κάθε λεπτό για την προσομοίωση πραγματικών μετρήσεων αισθητήρα.
Πώς μπορούμε να δημιουργήσουμε μια λύση ώστε το JSON μας να ενημερώνεται δυναμικά όταν γίνεται κλήση μέσω αιτήματος HTTP;
Δημιουργία Περιβάλλοντος Ανάπτυξης PHP
Δεν θα εμβαθύνω στις περιπλοκές της δημιουργίας ενός περιβάλλοντος ανάπτυξης PHP, καθώς υπάρχουν άλλα άρθρα που το εξηγούν αρκετά καλά. Θα πω, ωστόσο, ότι είναι χρήσιμο να δημιουργήσετε ένα περιβάλλον PHP στο τοπικό σας σύστημα για να δημιουργήσετε σενάρια PHP αντί να δημιουργήσετε σενάρια PHP σε ένα πρόγραμμα επεξεργασίας κειμένου και να τα στείλετε μέσω FTP στον πάροχο φιλοξενίας σας και να προσπαθήσετε να κάνετε εντοπισμό σφαλμάτων. Ακολουθούν τα γενικά μου βήματα για τη δημιουργία ενός τοπικού περιβάλλοντος προγραμματιστή PHP:
- Εγκαταστήστε το VirtualBox για εκτέλεση σε VM Windows 10. (Θα μπορούσα να είχα χρησιμοποιήσει επίσης ένα Raspberry Pi ή άλλο αποκλειστικό πλαίσιο Linux.)
- Εγκαταστήστε το Ubuntu στο VirtualBox.
- Δημιουργήστε έναν κοινόχρηστο φάκελο χρησιμοποιώντας το VirtualBox για να μοιράζεστε αρχεία μεταξύ του Ubuntu στο VirtualBox και του κεντρικού λειτουργικού συστήματος Windows 10.
- Χρησιμοποιήστε τον κώδικα του Visual Studio στα Windows για να επεξεργαστείτε τα αρχεία PHP στον κοινόχρηστο φάκελο. (Θα μπορούσα να έχω τρέξει VS Code και στο Ubuntu.)
- Εγκαταστήστε το δημοφιλές PHP Intelephense Επέκταση VS Code για ενεργοποίηση της PHP intellisense και άλλων δυνατοτήτων.
- Εγκαταστήστε τη στοίβα LAMP (Linux Apache MySQL PHP) στο Ubuntu χρησιμοποιώντας αυτό το σεμινάριο. Η MySQL δεν χρειαζόταν στο τρέχον περιβάλλον μου, αλλά την εγκατέστησα ούτως ή άλλως για πιθανή χρήση σε μελλοντικά έργα.
Βρήκα επίσης χρήσιμο να συμπεριλάβω τις ακόλουθες γραμμές στην κορυφή του αρχείου μου PHP για να εμφανίζονται λεπτομερή μηνύματα σφάλματος κατά τον εντοπισμό σφαλμάτων αντί για το γενικό σφάλμα 500 (λευκή οθόνη θανάτου) ανά αυτή η ανάρτηση υπερχείλισης στοίβας:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On'); //On or Off
Σχολίασα αυτές τις γραμμές αφού απέδειξα τον κώδικα για να αποφύγω την αποκάλυψη λεπτομερών μηνυμάτων σφάλματος κατά την εκτέλεση του κώδικα σε ένα σενάριο παραγωγής. Τα λεπτομερή μηνύματα σφάλματος είναι χρήσιμα για πιθανούς χάκερ και ενδέχεται να αποκαλύψουν ευαίσθητες πληροφορίες σχετικά με τον ιστότοπό σας.
Κάτι ακόμα… Η PHP αναμένει ερωτηματικά στο τέλος κάθε δήλωσης. Θα εξοικονομήσετε πολύ χρόνο στον εντοπισμό σφαλμάτων εάν το θυμάστε αυτό! 😉
Με το υπόβαθρο και τις προϋποθέσεις που συζητήθηκαν, ας τολμήσουμε και ας εξερευνήσουμε τρεις τρόπους για τη δημιουργία δυναμικών API Ιστού χρησιμοποιώντας PHP.
Μέθοδος #1: Χρησιμοποιήστε την Αντικατάσταση συμβολοσειράς PHP
Μπορούμε να πετύχουμε τον στόχο χρησιμοποιώντας τον παρακάτω κώδικα:
<?php
$data = <<<JSON
{
"Tank": "Tank1",
"watertemp": {
"time": "%timestamp",
"value": %value1
}
}
JSON;
$timestamp = "2019-05-11 22:20 GMT";
$temperature = 72.5;
$data = str_replace('%timestamp', $timestamp, $data);
$data = str_replace('%value1', $temperature, $data);
header('Content-Type: application/json');
echo $data;
Χρησιμοποιούμε την PHP heredoc σύνταξη για να ορίσετε μια συμβολοσειρά πολλών γραμμών που περιέχει το πρότυπο JSON προς επιστροφή. Η σύνταξη heredoc ξεκινά με μια γραμμή που περιέχει <<<
ακολουθούμενο από ένα αναγνωριστικό („JSON“ στο παραπάνω δείγμα) και τελειώνει με μια γραμμή που περιέχει το αναγνωριστικό από μόνο του σε μια γραμμή. Οι ενδιάμεσες γραμμές αποθηκεύονται σε μια μεταβλητή που ονομάζεται $data
.
Αυτό το πρότυπο JSON περιέχει ειδικά σύμβολα κράτησης θέσης που ξεκινούν με „%“ (%timestamp και %value1) που θα αντικαταστήσουμε με τις δυναμικές τιμές της επιλογής μας. Η χρήση λέξεων με πρόθεμα „%“ είναι μια αυθαίρετη σύμβαση που δημιουργήσαμε και μπορείτε να επιλέξετε κάτι διαφορετικό.
Στη συνέχεια χρησιμοποιούμε την PHP συνάρτηση str_replace για να ανταλλάξουμε το κείμενο κράτησης θέσης με τα δεδομένα της επιλογής μας.
Στη συνέχεια, χρησιμοποιούμε το Λειτουργία κεφαλίδας PHP για να στείλετε μια κεφαλίδα HTTP με τον τύπο JSON MIME για να διασφαλίσετε ότι το πρόγραμμα κλήσης (ή το πρόγραμμα περιήγησης ιστού) κατανοεί τη μορφή των δεδομένων που επιστρέφονται. Αυτή η κεφαλίδα θα μπορούσε να παραλειφθεί σε πολλά περιβάλλοντα, αλλά προσθέτει ένα άλλο επίπεδο πληρότητας και ορθότητας και αφαιρεί την ασάφεια.
Τέλος, χρησιμοποιώντας την εντολή echo, βγάζουμε τα περιεχόμενα του δικού μας $data
μεταβλητή στη ροή απόκρισης HTTP.
Σημείωση: Οι οξυδερκείς αναγνώστες μου που έχουν ασχοληθεί με τον προγραμματισμό PHP μπορεί να παρατηρήσουν ότι απέκλεισα την ετικέτα κλεισίματος „?>“ του μπλοκ PHP. Όπως σημειώνεται στο Τεκμηρίωση PHP, η ετικέτα κλεισίματος ενός μπλοκ PHP στο τέλος ενός αρχείου είναι προαιρετική και μπορεί να είναι επιθυμητό να μην συμπεριληφθεί σε ορισμένα περιβάλλοντα. Επέλεξα λοιπόν να το παραλείψω.
Χρησιμοποιώντας το βασικό πλαίσιο που παρέχεται παραπάνω, μπορούμε να επεκτείνουμε τον κώδικά μας για να ανακτήσουμε την τρέχουσα ώρα και να δημιουργήσουμε μια τυχαία τιμή float που κυμαίνεται από 72,0 έως 73,0 για $temperature
.
<?php
function rand_float($min, $max, $decimals)
{
if ($min > $max) {
$temp = $min;
$min = $max;
$max = $temp;
}
$r = (float)rand() / (float)getrandmax();
$float = ($min + $r * abs($max - $min));
return number_format($float, $decimals);
}
$data = <<<JSON
{
"Tank": "Tank1",
"watertemp": {
"time": "%timestamp",
"value": %value1
}
}
JSON;
// $timestamp = "2019-05-11 22:20 GMT";
$timeFormat = 'Y-m-d H:i T';
$timestamp = gmdate($timeFormat, time());
$low = 72.0;
$high = 73.0;
$decimals = 2;
$temperature = rand_float($low, $high, $decimals);
$data = str_replace('%timestamp', $timestamp, $data);
$data = str_replace('%value1', $temperature, $data);
header('Content-Type: application/json');
echo $data;
Μέθοδος #2: Χρήση συσχετιστικού πίνακα PHP με κωδικοποίηση JSON
Αντί να αντικαταστήσουμε το δυναμικό κείμενο για τα σύμβολα κράτησης θέσης σε ένα πρότυπο συμβολοσειράς, μπορούμε να χρησιμοποιήσουμε μια εγγενή δομή δεδομένων PHP που ονομάζεται συσχετικός πίνακας για να αποθηκεύσετε ζεύγη τιμών κλειδιών και τελικά να αποδώσετε αυτήν τη δομή δεδομένων ως JSON.
Ορίστε!
<?php
$timestamp = "2019-05-11 22:20 GMT";
$temperature = 72.5;
$data["Tank"] = "Tank1";
$data["watertemp"]["time"] = $timestamp;
$data["watertemp"]["value"] = $temperature;
$json = json_encode($data, JSON_PRETTY_PRINT);
header('Content-Type: application/json');
echo $json;
Ορίζουμε έναν συσχετιστικό πίνακα που ονομάζεται $data
για τη θερμοκρασία του νερού της δεξαμενής και χρησιμοποιήστε την PHP json_encode λειτουργία για να επιστρέψει μια αναπαράσταση JSON του $data
πίνακας. Περιλαμβάνουμε και το προαιρετικό JSON_PRETTY_PRINT
παράμετρος στο json_encode
λειτουργία για την επιστροφή του αποτελέσματος JSON με οριζόντια και κάθετη μορφοποίηση κενού διαστήματος για να διασφαλιστεί ότι το JSON είναι αναγνώσιμο από τον άνθρωπο και όχι μόνο από μηχανή (ή οριακά από τον άνθρωπο).
Το αποτέλεσμά μας μοιάζει με αυτό:
{
"Tank": "Tank1",
"watertemp": {
"time": "2019-05-11 22:20 GMT",
"value": 72.5
}
}
Θα παρατηρήσετε ότι η όμορφη εκτύπωση PHP JSON χρησιμοποιεί τέσσερα κενά για εσοχές. Το προηγούμενο πρότυπο συμβολοσειράς μας στη μέθοδο #1 χρησιμοποιούσε δύο κενά που είναι η προτίμησή μου από τότε που χρησιμοποιώ Ομορφότερος με VS Code από τη μορφοποίηση JSON μου. Είτε δύο είτε τέσσερα κενά φαίνονται ωραία. Ωστόσο, ήθελα να επισημάνω αυτή τη μικρή λεπτότητα μορφοποίησης εξόδου.
Θα μπορούσαμε, φυσικά, να επεκτείνουμε αυτό το παράδειγμα για να αλλάξουμε δυναμικά τη χρονική σήμανση και τη θερμοκρασία του νερού, αλλά σε αυτό το σημείο θέλω κυρίως να δείτε και να κατανοήσετε τη μηχανική και τις υψηλού επιπέδου διαφορές μεταξύ της μεθόδου #1 και της μεθόδου #2.
Μέθοδος #3: Χρησιμοποιήστε τον ioTSimulator
Επέκτεινα τη μέθοδο #1 και δημιούργησα μια συνάρτηση PHP στο GitHub που ονομάζεται iotSimulator-php για να επιτρέψει στους χρήστες να δημιουργήσουν JSON Web API για την προσομοίωση αναγνώσεων αισθητήρων IoT. Μπορεί επίσης να χρησιμοποιηθεί σε άλλα πλαίσια πέρα από το IoT.
ο iotSimulator.php
Το αρχείο περιέχει μια λειτουργία για τη δημιουργία JSON Web API για την προσομοίωση αναγνώσεων αισθητήρων IoT. Παρέχετε ένα πρότυπο που περιέχει την επιθυμητή δομή δεδομένων JSON μαζί με τα ανώτερα και κατώτερα όρια περιορισμών τυχαίων αριθμών για κάθε ανάγνωση αισθητήρα. Καθώς η σελίδα PHP ανανεώνεται, νέες τυχαίες αναγνώσεις θα εμφανίζονται κάθε λεπτό. Οι αναγνώσεις από τα προηγούμενα λεπτά θα διατηρήσουν τις τιμές τους κατά την ανανέωση της σελίδας αντί να αντικατασταθούν με νέα τυχαία δεδομένα.
Για να ξεκινήσετε, αντιγράψτε iotSimulator.php σε έναν κατάλογο Ιστού που υποστηρίζει την απόδοση σεναρίων PHP στον πάροχο φιλοξενίας ή στο τοπικό σας σύστημα.
Δημιουργήστε ένα αρχείο (για παράδειγμα, tanks.php
) στον ίδιο κατάλογο ιστού και να περιλαμβάνει το ακόλουθο περιεχόμενο:
<?php
require('iotSimulator.php');
$template = <<<JSON
{
"Tank": "Tank1",
"watertemp": {
"time": "%timestamp",
"value": %val(70,71)
}
}
JSON;
$useGMT = true;
// Sample format: 2019-05-10 19:03 GMT
$timeFormat = 'Y-m-d H:i T';
render_json($template, $useGMT, $timeFormat);
Τροποποιήστε το περιεχόμενο στις γραμμές που ακολουθούν τη γραμμή „$template =“ και τη γραμμή „JSON;“ γραμμή με το αντικείμενο JSON ή τα αντικείμενα που θέλετε να αποδώσετε.
Τα πεδία ενδιαφέροντος δυναμικού προτύπου είναι:
- %timestamp – Αντικαθίσταται με την τρέχουσα χρονική σήμανση κατά την απόδοση της σελίδας.
- %val(x,y,[decimals]) – Αυτό θα αποδώσει έναν τυχαίο αριθμό μεταξύ x και y. Αν
decimals
δεν παρέχεται, ο αριθμός που προκύπτει θα στρογγυλοποιηθεί σε 2 δεκαδικά.
Στο παράδειγμά μας, αποδίδουμε μια τυχαία ένδειξη αισθητήρα μεταξύ 70 και 71 (με προεπιλογή 2 δεκαδικά ψηφία) για το Tank1.
Αποθηκεύστε το tanks.php
αρχείο και μεταβείτε στη διεύθυνση URL στο πρόγραμμα περιήγησής σας. Για παράδειγμα: https://thisdavej.com/api/tanks.php.
Τα αποτελέσματα που αποδίδονται θα μοιάζουν κάπως έτσι αφού από προεπιλογή εμφανίζονται 3 σειρές (λεπτά) δεδομένων:
[
{
"Tank": "Tank1",
"watertemp": {
"time": "2019-05-10 19:03 GMT",
"value": 70.62
}
},
{
"Tank": "Tank1",
"watertemp": {
"time": "2019-05-10 19:02 GMT",
"value": 70.55
}
},
{
"Tank": "Tank1",
"watertemp": {
"time": "2019-05-10 19:01 GMT",
"value": 70.7
}
}
]
Σημειώστε ότι η συνάρτηση PHP πρόσθεσε ένα „[“ at start and a „]“ στο τέλος για να δημιουργήσετε έναν πίνακα αντικειμένων JSON με κάθε αντικείμενο JSON που αποδίδεται με βάση το πρότυπο που παρέχεται.
Μπορείτε να αναφέρετε το Σελίδα iotSimulator-php GitHub για την πλήρη τεκμηρίωση.
συμπέρασμα
Η PHP είναι πολύ εύχρηστη και μπορεί να χρησιμοποιηθεί για απόδοση από την πλευρά του διακομιστή των Web API. Θα μπορούσατε επίσης να το χρησιμοποιήσετε σε πρόσθετα σενάρια δυναμικής απόδοσης, όπως σύνδεση σε βάσεις δεδομένων (MySQL, Postgres, κ.λπ.) ή πραγματικές (και όχι απλώς προσομοίωση) μετρήσεις αισθητήρων IoT. Ελπίζω να σας άρεσε αυτό το άρθρο και να μάθατε κάτι νέο στη διαδικασία!
Ακολουθήστε το @thisDaveJ (Dave Johnson) στο Twitter για να μείνετε ενημερωμένοι με τα πιο πρόσφατα σεμινάρια και άρθρα τεχνολογίας.
Πρόσθετα άρθρα
Ανάκτηση, φιλτράρισμα και ταξινόμηση JSON API στα Φύλλα Google: Οι λειτουργίες που λείπουν
Μάθετε Handlebars με το Node.js και Βοηθήστε και το Freddy’s Fish
Πώς να μετρήσετε μοναδικά στοιχεία σε συστοιχίες JavaScript
Πώς να φιλοξενήσετε έναν διακομιστή Web Raspberry Pi στο Διαδίκτυο με το ngrok
Τελευταία ενημέρωση 13 Μαΐου 2019