php-də api-yə daxil olmaq nümunəsi. PHP-də RESTful API yaradılması

Layihəni hazırlayarkən mən bütün məlumatların - faktiki mysql verilənlər bazası, şəkillər, fayllar və digər məzmunların saxlandığı veb-saytımla iOS və Android platformalarında tətbiqlər arasında müştəri-server qarşılıqlı əlaqəsini təşkil etmək zərurəti ilə üzləşdim.
Həll edilməli olan problemlər olduqca sadə idi:
istifadəçi qeydiyyatı/icazəsi;
müəyyən məlumatların göndərilməsi/qəbul edilməsi (məsələn, məhsulların siyahısı).

Və sonra server tərəfi ilə qarşılıqlı əlaqə yaratmaq üçün öz API-mi yazmaq istədim - əsasən praktik maraq üçün.

Daxiletmə məlumatları

Mənim ixtiyarımda idi:
Server - Apache, PHP 5.0, MySQL 5.0
Müştəri - Android, iOS cihazları, istənilən brauzer

PHP və Android-də sadəliyi və yerli dəstəyi üçün serverə sorğular və ondan gələn cavablar üçün JSON məlumat formatından istifadə etməyi qərara aldım. Burada iOS məni üzdü - onun yerli JSON dəstəyi yoxdur (burada mən üçüncü tərəfin inkişafından istifadə etməli oldum).

Həmçinin qərara alınıb ki, sorğular həm GET, həm də POST sorğuları vasitəsilə göndərilə bilər (burada PHP-də $_REQUEST kömək edir). Bu həll API-ni istənilən mövcud brauzerdə GET sorğuları vasitəsilə sınaqdan keçirməyə imkan verdi.

Sorğuların görünüşünü belə etmək qərara alındı:
http://[server ünvanı]/[api qovluğuna gedən yol]/?[api_adı].[metod_name]=

Api qovluğuna gedən yol, sorğu göndərməyiniz lazım olan qovluqdur, onun kökündə index.php faylı yerləşir - o, funksiyaların çağırılmasına və səhvlərin idarə olunmasına cavabdehdir.
Ad api - rahatlıq üçün API qruplarını ayırmaq qərarına gəldim - istifadəçi, verilənlər bazası, məzmun və s. Bu halda, hər bir API-nin öz adı var
Metod adı - göstərilən api-də çağırılmalı olan metodun adı
JSON - metod parametrləri üçün JSON obyektinin sətir təsviri

Skeleton API

Server tərəfindəki API skeleti bir neçə əsas sinifdən ibarətdir:
index.php - Apache-də kataloqun indeks faylı, bütün API çağırışlarını, parametrləri təhlil edir və API üsullarını çağırır
MySQLiWorker - MySQLi vasitəsilə MySQL verilənlər bazası ilə işləmək üçün vahid sinif
apiBaseCalss.php sistemdəki bütün API-lər üçün ana sinifdir - düzgün işləmək üçün hər bir API bu sinifdən miras almalıdır.
apiEngine.php - sistemin əsas sinfi - ötürülən parametrləri təhlil edir (onların index.php-də ilkin təhlilindən sonra), tələb olunan api sinfini birləşdirir (require_once metodu ilə), orada tələb olunan metodu çağırır və nəticəni JSON-da qaytarır. format
apiConstants.php - api zəngləri və xətaların ötürülməsi üçün sabitləri olan sinif
apitest.php - yeni metodları istehsal versiyasına daxil etməzdən əvvəl sınaqdan keçirmək üçün api-ni sınaqdan keçirin

Bütün mexanizm belə görünür:
Biz serverə sorğu göndəririk - məsələn www.example.com/api/?apitest.helloWorld= ()
Server tərəfində index.php faylı ötürülən parametrləri təhlil edir. Index.php həmişə keçən $_REQUEST parametrləri siyahısından yalnız birinci elementi götürür - bu o deməkdir ki, www.example.com/api/?apitest.helloWorld= ()&apitest.helloWorld2 - yalnız helloWorld metodunu çağıracaq. aciq. helloWorld2 metodu çağırılmayacaq

İndi hər biri haqqında daha ətraflı məlumat

Mətn üçün çox yer tutmamaq üçün faylları kifayət qədər sənədləşdirməyə çalışdım. Ancaq şərh olmayan fayllarda hələ də təsviri təqdim edəcəyəm.

Index.php

Daha əvvəl dediyim kimi, bu, Apache üçün giriş indeks faylıdır, yəni www.example.com/api kimi bütün zəngləri qəbul edəcək.

0)( require_once "apiEngine.php"; foreach ($_REQUEST olaraq $apiFunctionName => $apiFunctionParams) ( $APIEngine=new APIEngine($apiFunctionName,$apiFunctionParams); echo $APIEngine->callApiFun)();else) ( $jsonError->error="Funksiya çağırılmayıb"; echo json_encode($jsonError); ) ?>

Hər şeydən əvvəl, məzmun növünü təyin etdik - mətn / html (sonra onu üsulların özündə dəyişə bilərsiniz) və kodlaşdırma - UTF-8.
Sonra yoxlayırıq ki, bizdən nəsə istəyirlər. Əks halda, JSON-u xəta ilə çıxarırıq.
Əgər sorğu parametrləri varsa, onda biz API mühərrik faylını - apiEngine.php-ni birləşdiririk və ötürülən parametrlərlə mühərrik sinfi yaradırıq və api metoduna zəng edirik.
Yalnız bir zəngi emal edəcəyimizə qərar verdiyimiz üçün dövrədən çıxırıq.

apiEngine.php

İkinci ən vacib sinif apiEngine sinfidir - bu, api və onların metodlarını çağırmaq üçün mühərrikdir.
apiFunctionParams = stripcslashes($apiFunctionParams); //İki elementdən ibarət massivi təhlil edin - API-nin adı, - API-də metodun adı $this->apiFunctionName = explode("_", $apiFunctionName); ) //JSON cavab funksiyasını yaradın createDefaultJson() ( $retObject = json_decode("()"); $response = APIConstants::$RESPONSE; $retObject->$response = json_decode("()"); qaytarın $retObject ; ) əgər (file_exists($apiName . ".php")) ( $apiClass = APIEngine::getApiEngineByName($apiName); // API obyektini əldə edin $apiReflection = yeni ReflectionClass($apiName); // əks vasitəsilə sınaq obyekti sinfi haqqında məlumat alırıq ( $functionName = $this->apiFunctionName;//Çağırmaq üçün metodun adı $apiReflection->getMethod($functionName);//metodunun mövcudluğunu yoxlayın $response = APIConstants: :$RESPONSE; $jsonParams = json_decode($this- >apiFunctionParams);//Sorğu parametrlərini JSON obyektinə deşifrə edin if ($jsonParams) ( if (isset($jsonParams->responseBinary))(//Qayda bilmək üçün JSON deyil, zip, png və digər məzmun kimi ikili verilənlər $apiClass->$functionName($jsonParams);//APİ-də metodu çağırın )başqa ($resultFunctionCall->$response = $apiClass->$functionName) ($jsonParams);//API-də JSON obyektini qaytaracaq metoda zəng edin) ) else ( //Əgər JSON sorğu parametrlərinin dekodlanmasında xəta varsa $resultFunctionCall->errno = APIConstants::$ERROR_ENGINE_PARAMS; $resultFunctionCall->error = "Params verilmiş xəta"; ) ) catch (Exception $ex) ( //Gözlənilməz istisna $resultFunctionCall->xəta = $ex->getMessage(); ) ) else ( //Əgər tələb olunan API tapılmazsa $resultFunctionCall->errno = APIConstants::$ ERROR_ENGINE_PARAMS; $resultFunctionCall->error = "Fayl tapılmadı"; $resultFunctionCall->REQUEST = $_REQUEST ) json_encode($resultFunctionCall); ) ) ?>

apiConstants.php

Bu sinif yalnız sabitləri saxlamaq üçün istifadə olunur.

MySQLiWorker.php

Verilənlər bazası ilə işləmək üçün vahid sinif. Əks təqdirdə, bu adi bir təkdir - İnternetdə belə nümunələr çoxdur.

dbName = $dbName; self::$instance->dbHost = $dbHost; self::$instance->dbUser = $dbUser; self::$instance->dbPassword = $dbPassword; self::$instance->openConnection(); ) özünü qaytarın::$instance; ) //Sorğu parametrlərinin növlərini verilənlər bazasına təyin edin və ->bağlama funksiyası vasitəsilə bağlama üçün sətri qaytarın HazırParams($params) ( $retSTMTString = ""; foreach ($params $dəyər) (if (is_int() $value) || is_double ($value)) ( $retSTMTString.="d"; ) if (is_string($value)) ( $retSTMTString.="s"; ) ) $retSTMTString-ə qoşulun; verilənlər bazası ictimai funksiyası openConnection() ( if (is_null($this->connectLink)) ( $this->connectLink = yeni mysqli($this->dbHost, $this->dbUser, $this->dbPassword, $this-> dbName); $this-> connectLink->query("SET NAMES utf8" if (mysqli_connect_errno()) ( printf("Bağlantı mümkün deyil: %s\n", mysqli_connect_error()); $this->connectLink = null; ) else ( mysqli_report(MYSQLI_REPORT_ERROR ); ) ) return $this->connectLink; ) //Verilənlər bazası ilə əlaqəni bağlayın closeConnection() ( if (!is_null($this->connectLink)) ( $this- >connectLink->close() ) //Cavabın assosiativ massivinə çevrilməsi ictimai funksiya stmt_bind_assoc(&$stmt, &$out) ( $data = mysqli_stmt_result_metadata($stmt); $fields = massiv(); $out = massiv(); $sahələr = $stmt; $count = 1; $currentTable = ""; isə ($field = mysqli_fetch_field($data)) ( if (strlen($currentTable) == 0) ( $currentTable = $field->table; ) $fields[$count] = &$out[$field->name ]; $count++; call_user_func_array("mysqli_stmt_bind_result", $fields); ) ) ?>

apiBaseClass.php

Yaxşı, sistemin ən vacib siniflərindən birinə - sistemdəki bütün API-lər üçün əsas sinifə gəldik.

mySQLWorker = MySQLiWorker::getInstance($dbName,$dbHost,$dbUser,$dbPassword); ) ) funksiyası __destruct() ( if (isset($this->mySQLWorker))( //Əgər verilənlər bazası ilə əlaqə qurulubsa, $this->mySQLWorker->closeConnection(); //sonra sinifimiz açıldıqda onu bağlayın. artıq lazım deyil ) ) //Cavab funksiyası üçün defolt JSON yaradın createDefaultJson() ( $retObject = json_decode("()"); return $retObject; ) //JSON obyektini MySQLiWorker fillJSON(&$) funksiyasının cavabı ilə doldurun jsonObject, &$stmt, &$mySQLWorker) ( $row = array(); $mySQLWorker->stmt_bind_assoc($stmt, $row); while ($stmt->fetch()) ( foreach ($açar kimi $sətir =) > $value) ($ düyməsi = strtolower($key); $jsonObject->$key = $value; break; $jsonObject qaytarın;

Gördüyünüz kimi, bu sinifdə bir neçə "faydalı" metod var, məsələn:
cari API verilənlər bazası ilə işləyəcəksə, verilənlər bazası ilə əlaqənin qurulduğu konstruktor;
destruktor - resursların buraxılmasına nəzarət edir - verilənlər bazası ilə qurulmuş əlaqəni pozur
createDefaultJson - metod cavabı üçün standart JSON yaradır
fillJSON - sorğunun yalnız bir qeydi qaytaracağı güman edilirsə, bu üsul cavab üçün JSON-u verilənlər bazasından cavabın birinci sətirindəki məlumatlarla dolduracaq.

Öz API-mizi yaradaq

Bu, əslində bu API-nin bütün onurğa sütunudur. İndi apitest adlı ilk API-nin yaradılması nümunəsindən istifadə edərək bütün bunların necə istifadə olunacağına baxaq. Və ona bir neçə sadə funksiya yazaq:
parametrləri olmayan biri
parametrləri olan bir və o, onları bizə qaytaracaq ki, onları oxuduğu aydın olsun
bizə ikili məlumatları qaytaracaq biri

Beləliklə, biz aşağıdakı məzmunlu apitest.php sinfi yaradırıq

createDefaultJson(); $retJSON->withoutParams = "Bu, parametrlərsiz çağırılan metoddur"; $retJSON qaytarın; ) //http://www.example.com/api/?apitest.helloAPIWithParams=("TestParamOne":"Birincinin mətni parametr") funksiyası helloAPIWithParams($apiMethodParams) ( $retJSON = $this->createDefaultJson(); əgər (isset($apiMethodParams->TestParamOne))( //Hər şey qaydasındadır, parametrlər düzgündür, biz onları $retJSON qaytaracağıq. ->retParameter=$ apiMethodParams->TestParamOne )else( $retJSON->errorno= APIConstants::$ERROR_PARAMS; ) return $retJSON; ("responseBinary": 1) helloAPIResponseBinary($apiMethodParams)( başlıq("Məzmun növü: image/png"); echo file_get_contents("http://habrahabr.ru/i/error-404-monster.jpg") funksiyası ;)) ?>

Sınaq üsullarının rahatlığı üçün onlara test üçün tez sorğu göndərə biləcəyim bir ünvan əlavə edirəm.

Beləliklə, üç üsulumuz var

helloAPI() funksiyası ( $retJSON = $this->createDefaultJson(); $retJSON->withoutParams = "Bu, parametrlərsiz çağırılan metoddur"; $retJSON; qaytarın)

Bu parametrləri olmayan sadə bir üsuldur. GET zəngi üçün ünvanı www.example.com/api/?apitest.helloAPI= ()

İcra nəticəsi belə bir səhifə olacaq (brauzerdə)

Bu üsul parametrləri qəbul edir. TestParamOne tələb olunur və biz bunu yoxlayacağıq. O, ötürülə bilməz, JSON xəta ilə qaytarılacaq

Funksiya helloAPIWithParams($apiMethodParams) ( $retJSON = $this->createDefaultJson(); əgər (isset($apiMethodParams->TestParamOne))( //Hər şey qaydasındadır, parametrlər düzgündür, biz onları $retJSON->retPara qaytaracağıq. =$apiMethodParams-> TestParamOne; )else( $retJSON->errorno= APIConstants::$ERROR_PARAMS; ) return $retJSON;
İcra nəticəsi

salamAPIResponseBinary

Və sonuncu üsul helloAPIResponseBinary - ikili məlumatları qaytaracaq - mövcud olmayan bir səhifə haqqında habr şəkli (nümunə kimi)
funksiya helloAPIResponseBinary($apiMethodParams)( başlıq("Məzmun növü: image/jpeg"); echo file_get_contents("http://habrahabr.ru/i/error-404-monster.jpg"); )
Gördüyünüz kimi, qrafik məzmunu göstərmək üçün başlığın dəyişdirilməsi var.
Nəticə belə olacaq

Bu yaxınlarda ziyarətçilərimdən biri mənə sual verdi e-poçt: "". Bunun digər istifadəçilər üçün çox faydalı olacağına qərar verdim, xüsusən də prosesin görünən mürəkkəbliyinə baxmayaraq, hər şey çox, çox sadədir. Siz sadəcə ən əsas biliklərə sahib olmalısınız. PHP.

Birdən nədən danışdığımızı başa düşmürsənsə, əvvəlcə məqaləni oxuyun:. Davam et. Gəlin baxaq, onlar hansı saytlar üçün lazımdır? API:

Anlamalı olduğunuz ilk şey budur API Hər saytın buna ehtiyacı yoxdur (yuxarıdakı qruplardan birinə aid olsa belə).

Əgər belə düşünürsənsə API vebsaytınızda lazımdır, onda gəlin onun necə yaradıldığına dair bir nümunəyə baxaq. Gəlin bizə aşağıdakı tapşırığı verək: EPS var (məsələn, WebMoney). Və biz istəyirik ki, istifadəçi bizim kodumuzdan istifadə edərək öz kodundan istifadə edə bilsin API, hesabınızdakı balansı tapın.

Gəlin bir fayl yaradaq (məsələn, api.php), biz alacağıq sorğuları GET istifadəçilərdən müxtəlif məlumatlar almaq. Bu işləyiciyə aşağıdakı kodu yazaq:

əgər ($_GET["fəaliyyət"] == "balans əldə etmək") (
$balance;
//Bazadan hesab balansını tapın və balans dəyişəninə yazın
echo $balance;
}
?>

İndi tərtibatçılar APIİstifadəçi hesab balansını öyrənə bilməsi üçün istifadəçilərə sorğunun necə göndərilməsi barədə məlumat verməlidir:

Http://mysite.ru/api.php?action=getbalance&key=fa9sgwlgjs9gdsjlgjdsjglsdlgs

İstifadəçilər bu sorğunu öz skriptlərində formalaşdırırlar (məsələn, vasitəsilə cURL). Parametr açar hər bir istifadəçi üçün unikal açardır. Və bu sorğuya cavab istifadəçinin balansına cavabdeh olan nömrə olacaq. Bütün digər imkanlar da eyni şəkildə yaradılır. API. Siz müxtəlif digər parametrlər əlavə edə bilərsiniz: məsələn, bir tarixdən digərinə hesabın doldurulması əməliyyatlarının siyahısını əldə edin. Siyahıların özlərini formatda qaytarmaq məsləhətdir JSON.

Yeddi keçi və gözü olmayan bir canavar

PHP-də RESTful API yaradılması

REST və ya tam formada, Nümayəndəlik dövlətinin köçürülməsi web API inkişafı üçün standart dizayn arxitekturasına çevrilmişdir.

REST heç bir əlavə arxa təbəqə olmadan çox sadə məlumat idarəetmə interfeysidir. Hər bir məlumat parçası URL kimi qlobal identifikatorla unikal şəkildə müəyyən edilir. Hər bir URL, öz növbəsində, ciddi şəkildə müəyyən edilmiş formata malikdir.

REST mövcud HTTP arxitekturasına daxil olmaq üçün HTTP sorğu metodlarından istifadə edir. Bu əməliyyatlar aşağıdakılardır:

GET - serverə əsas oxu sorğuları üçün istifadə olunur

PUT- Serverdə mövcud olan obyekti dəyişdirmək üçün istifadə olunur

POST- Serverdə yeni obyekt yaratmaq üçün istifadə olunur

DELETE - serverdəki obyekti silmək üçün istifadə olunur

İndi isə mətləbə, yəni. layihələrinizdə istifadə edə biləcəyiniz sadə bir API yazmaq.

API nədir

Geniş mənada API metodlara açıq şəkildə daxil olmağa və kənardan idarə etməyə imkan verən veb proqram interfeysidir. API-nin ümumi istifadəsi, resursa (məsələn, veb-sayt) daxil olmadan proqramdan (məsələn, məqalə və ya bəzi digər məlumatlar) məlumat əldə etməyiniz lazım olduqda olur. Bunu mümkün etmək üçün üçüncü tərəf proqramlarına sorğular etməyə və müəyyən edilmiş məlumatları xaricdən istifadəçiyə qaytarmağa imkan verən tətbiq üçün API tətbiq edilir. İnternetdə bu, tez-tez RESTful istifadə edərək edilir.

Nümunə məqalə sorğusunda API URI-ni ehtiva edə bilər:

example.com/api/v1/recipe/article

Bu URL-ə GET sorğusu göndərsəniz, cavab ən son xəbərlərin siyahısı ola bilər, PUT sorğusu xəbərləri verilənlər bazasına əlavə edə bilər.

Əgər /məqalə /141-i tələb etsəniz, bu, müəyyən bir xəbər olacaq. Bu nümunələr proqramla necə qarşılıqlı əlaqə qurmağı göstərir.

Öz API yaratmaq

GET sorğularını nəzarətçi üçün başa düşülən parametrlərə çevirmək üçün .htaccess faylı yaradaq.

RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule api/v1/(.*)$ api/v1/api.php?request=$1

Bu fayldakı sətirlər nə deməkdir?

Birinci sətir yenidən yazma modulunun mövcudluğunu yoxlayır. Əgər işləyirsə, aşağıdakı sətirlər yerinə yetirilir.

Sonra URL-ləri yenidən təyin etmək imkanı elan edilir. Bu o deməkdir ki, api/v1/ yolu api/v1/index.php-ə yönləndiriləcək. Simvollar (.*) emal edilməli dəyişənləri ifadə edir və $ növbəti məntiqin başladığı ayırıcıdır. Həmçinin - hərflərə həssas olmayan deməkdir - dəyişənlər yeni URL-ə əlavə olunacaq, L - mod_rewrite artıq göstəriləndən başqa heç nə işləmir.

Biz sinfi, xassələri və konstruktoru elan edirik.

abstrakt sinif API ( /** * Xüsusiyyət: metod * GET, POST, PUT, DELETE */ protected $method = ""; /** * Xüsusiyyət: son nöqtə * URI-də tələb olunan Model. məsələn: /files */ protected $endpoint = ""; /** * Xüsusiyyət: fel * Əsas metodlarla idarə oluna bilməyən şeylər üçün istifadə olunan isteğe bağlı əlavə deskriptor, məsələn: /files/process */ protected $verb = "". ; /** * Xüsusiyyət: args * Son nöqtə və feldən sonra hər hansı əlavə URI komponentləri, bizim * halda, resurs üçün tam ədəd identifikatoru silinmişdir. ///* və ya / /*/ qorunan $args = Array(); /** * Xüsusiyyət: fayl * PUT sorğusunun girişini saxlayır */ protected $file = Null; /** * Konstruktor: __construct * CORS üçün icazə verin, məlumatları toplayın və əvvəlcədən emal edin */ ictimai funksiya __construct($request) ( header("Access-Control-Allow-Orgin: *"); header("Access-Control" -İcazə Vermə Metodları: *"); başlıq("Məzmun növü: proqram/json"); $this->args = partlatmaq("/", rtrim($request, "/")); $this->endpoint = array_shift($this->args); if (array_key_exists(0, $this->args) && !is_numeric($this->args)) ( $this->fel = array_shift($this->args); ) $this->metod = $_SERVER["REQUEST_METHOD"] əgər ($this->metod == "POST" && array_key_exists("HTTP_X_HTTP_METHOD", $_SERVER)) ( if ($_SERVER["HTTP_X_HTTP_METHOD"] = "; SİL") ( $this->metod = "DELETE"; ) else if ($_SERVER["HTTP_X_HTTP_METHOD"] == "PUT") ( $this->method = "PUT"; ) else ( yeni İstisna atmaq(" Gözlənilməz Başlıq"); ) ) keçid($this->metod) ( "DELETE" halı: "POST" halı: $this->istək = $this->_cleanInputs($_POST); fasilə; "GET" işi: $ this->request = $this->_cleanInputs($_GET break); $this->fayl = file_get_contents("php://input"); fasilə; default: $this->_response("Etibarsız Metod", 405); fasilə; ) ) public funksiyası processAPI() ( əgər (metod_mövcuddur($this, $this->endpoint)) ($this->_response($this->($this->endpoint)($this->args) qaytarın); ) return $this->_response("Endpoint: $this->endpoint", 404 ) private function _response($data, $status = 200) ( header("HTTP/1.1 " . $status . " " . $this->_requestStatus($status)); return json_encode($data ) private function _cleanInputs($data) ( $clean_input = Array(); if (is_array($data)) (foreach ($k kimi)); => $v) ( $clean_input[$k] = $this->_cleanInputs($v); ) ) else ( $clean_input = trim(strip_tags($data)); ) return $clean_input ) private function _requestStatus($ kod) ( $status = massiv(200 => "OK", 404 => "Tapılmadı", 405 => "Metoda icazə verilmir", 500 => "Daxili Server xətası",); qaytarın ($status[$code ])?$status[$code]:$status ) )

Bu abstrakt sinfi elan etməklə biz PHP-nin bu sinfin konkret nümunəsini yaratmasının qarşısını aldıq. Oradan biz yalnız başqa sinifdə miras alaraq metodlardan istifadə edə bilərik. Qorunan metoda yalnız sinfin özündə və onun törəmələrində daxil olmaq olar.

API Sinifinin yaradılması

Biz abstrakt API sinifini miras alan MyAPI sinfi yaradırıq.

tələb_bir dəfə "API.class.php"; sinif MyAPI API genişləndirir ( qorunan $User; ictimai funksiya __construct($request, $origin) ( ana::__construct($request); // Mücərrəd, məsələn $APIKey = yeni Modellər\APIKey(); $İstifadəçi = yeni Modellər \User(); if (!array_key_exists("apiKey", $this->request)) ( new Exception("API Key təmin edilməyib"); ) else if (!$APIKey->verifyKey($this->request) ["apiKey"], $origin)) (yeni İstisna atın("Yanlış API Açarı"); ) əgər (array_key_exists("token", $this->request) && !$User->get("token", $this->request["token"])) ( atmaq yeni İstisna("Yanlış İstifadəçi Tokeni"); ) $this->User = $User) /** * Son nöqtə nümunəsi */ qorunan funksiya nümunəsi() () if ($this->metod == "GET") ( "Sizin adınızdır" qaytarın. $this->User->name; ) else ( "Yalnız GET sorğularını qəbul edir" qaytarın; ) ) )

API istifadə edərək

// Eyni serverdən sorğuların HTTP_ORIGIN başlığı yoxdur, əgər (!array_key_mövcuddur("HTTP_ORIGIN", $_SERVER)) ( $_SERVER["HTTP_ORIGIN"] = $_SERVER["SERVER_NAME"]; ) cəhd edin ( $API = new MyAPI($_REQUEST["request"], $_SERVER["HTTP_ORIGIN"] echo $API->processAPI(İstisna $e) ( echo json_encode("xəta" => $e- >); getMessage()));

Bunun yöndəmsiz tərcüməsi: http://coreymaynard.com/blog/creating-a-restful-api-with-php/

PHP MySQL-ə qoşulmaq üçün üç fərqli API təklif edir. Aşağıda mysql, mysqli və PDO uzantıları tərəfindən təmin edilən API-ləri göstəririk. Hər bir kod parçası "istifadəçi" istifadəçi adı və "parol" parolundan istifadə edərək "example.com" saytında işləyən MySQL serverinə bağlantı yaradır. Və istifadəçini salamlamaq üçün sorğu işə salınır.

Nümunə 1 Üç MySQL API-nin müqayisəsi

//mysqli
$mysqli = yeni mysqli ("example.com" , "istifadəçi" , "parol" , "verilənlər bazası" );
$nəticə = $mysqli -> query();
$sətir = $nəticə -> fetch_assoc();

//PDO
$pdo = yeni PDO ( "mysql:host=example.com;dbname=verilənlər bazası", "istifadəçi", "parol");
$statement = $pdo -> sorğu ( "DUAL-DAN _message AS "Salam, əziz MySQL istifadəçisi!" SEÇİN");
$sətir = $statement -> gətirmə (PDO::FETCH_ASSOC);
echo htmlentities($row["_message"]);

//mysql
$c = mysql_connect("example.com" , "istifadəçi" , "parol" );
mysql_select_db("verilənlər bazası");
$nəticə = mysql_query ( "DUAL-DAN _message AS "Salam, əziz MySQL istifadəçisi!" SEÇİN");
$sətir = mysql_fetch_assoc ($nəticə);
echo htmlentities($row["_message"]);
?>

Tövsiyə olunan API

Ya mysqli və ya PDO_MySQL uzantılarından istifadə etmək tövsiyə olunur. Köhnə mysql genişlənməsini yeni inkişaf üçün istifadə etmək tövsiyə edilmir, çünki o, PHP 5.5.0-da köhnəlmişdir və PHP 7-də silinmişdir. Aşağıda ətraflı xüsusiyyət müqayisə matrisi verilmişdir. Hər üç genişləndirmənin ümumi performansı təxminən eyni hesab olunur. Baxmayaraq ki, genişləndirmənin performansı PHP veb sorğusunun ümumi işləmə vaxtının yalnız bir hissəsini təşkil edir. Çox vaxt təsir 0,1% qədər aşağı olur.

Xüsusiyyətlərin müqayisəsi

ext/mysqli PDO_MySQL ext/mysql
PHP versiyası təqdim edildi 5.0 5.1 2.0
PHP 5.x-ə daxildir Bəli Bəli Bəli
PHP 7.x-ə daxildir Bəli Bəli Yox
İnkişaf vəziyyəti Aktiv Aktiv Yalnız 5.x-də texniki qulluq; 7.x-də silindi
Həyat dövrü Aktiv Aktiv 5.x-də köhnəlmişdir; 7.x-də silindi
Yeni layihələr üçün tövsiyə olunur Bəli Bəli Yox
OOP interfeysi Bəli Bəli Yox
Prosedur interfeysi Bəli Yox Bəli
mysqlnd ilə API bloklanmayan, asinxron sorğuları dəstəkləyir Bəli Yox Yox
Davamlı Əlaqələr Bəli Bəli Bəli
API Charsets dəstəkləyir Bəli Bəli Bəli
API server tərəfində Hazırlanmış Hesabatları dəstəkləyir Bəli Bəli Yox
API müştəri tərəfi Hazırlanmış Hesabatları dəstəkləyir Yox Bəli Yox
API Saxlanan Prosedurları dəstəkləyir Bəli Bəli Yox
API birdən çox bəyanatı dəstəkləyir Bəli Ən çox Yox
API Əməliyyatlarını dəstəkləyir Bəli Bəli Yox
Əməliyyatlar SQL ilə idarə oluna bilər Bəli Bəli Bəli
Bütün MySQL 5.1+ funksionallığını dəstəkləyir Bəli Ən çox Yox

Məndən tez-tez soruşurlar API ilə necə işləmək olar. ilə əlaqəli ən məşhur problem API, - VKontakte API ilə işləmək. Bu yazıda göstərəcəyəm VKontakte API ilə necə işləmək olar, və ən əsası, bunu sizə göstərəcəyəm bütün API-lər eyni prinsipə uyğun işləyir.

Budur prosedur etmək üçün bunu etməlisiniz istənilən API ilə işləməyə başlayın:

  1. Tap sənədlər lazım olduğu kimi API.
  2. Bax API əlaqə nümunələri. Burada müxtəlif variantlar ola bilər. Məsələn, bir xidmət qeydiyyatdan sonra verilən məxfi açarı tələb edəcək. İkinci xidmətdə bütün sorğular üçün gizli açarlar tələb olunmur. Üçüncü xidmətdə gizli açarla və olmadan işləmək üçün seçimlər var. Bəzən gizli açar çağırılır nişan.
  3. Kopyalayın sadə hazır kod sənədləşmə saytından və onun işini yoxlayın. Əgər işə yaramırsa, onda səhvi özünüz axtarın, çünki xidmətin olması ehtimalı azdır.
  4. Tap sənədlərdə üsul, probleminizi həll edir.
  5. Metodun nümunələrindən və təsvirindən istifadə edərək, API-yə düzgün sorğu göndərin.
  6. Cavabın formatından asılı olaraq, onu " komponentlər", və sonra tələb olunanı edin - onu istifadəçiyə göstərin, faylda saxlayın, verilənlər bazasına göndərin və s.

Və bu təlimatlara əməl etməyin bir nümunəsi olaraq baxacağıq VKontakte API. Belə ki:

  1. -a keçid sənədlər.
  2. Bu halda, ictimai olan və buna görə də nişan tələb etməyən üsullar və bir tələb edən üsullar var.
  3. Bu halda konkret dildə heç bir nümunə tapmadım. Ola bilsin ki, onlar oradadırlar, amma aydın görünmürlər. Adətən, at API Hər bir metod üçün müxtəlif dillərdə nümunələr var.
  4. Biz geri çəkilmək istəyirik Müəyyən bir istifadəçinin divarından ən son 5 yazı və sonra onları veb saytınızda göstərin. Bizə lazım olan üsul.

İndi məcburuq API-yə sorğu göndərin metodun təsvirindən istifadə etməklə. Biz bunu vasitəsilə edəcəyik PHP:

$wall = file_get_contents("https://api.vk.com/method/wall.get?v=5.3&filter=others&domain=myrusakov&count=5");
print_r($divar);
?>

Bu vəziyyətdə mən istifadə edirəm API 5.3 (v=5.3), müəllifindən asılı olmayaraq bütün qeydləri göstərirəm ( filter=digərləri) səhifənizdən ( domen=myrusakov) kəmiyyətcə 5 şeylər ( sayı = 5). Düşünürəm ki, burada hər şey çox şəffafdır.

Formada cavab aldıq JSON, və indi son nöqtəyə keçməliyik - cavabı təhlil edərək " komponentlər". Sonra divardan yazıları az-çox oxunaqlı formada saytımızın səhifəsində nümayiş etdirəcəyik. Nəticədə PHP kodu:

$wall = file_get_contents("http://api.vk.com/method/wall.get?v=5.3&filter=others&domain=myrusakov&count=5"); // Sorğu göndərin
$divar = json_decode($divar); // JSON sətirini massiləyə çevirin
$wall = $wall->cavab->elementlər; // Bir sıra şərhlər əldə edin
üçün ($i = 0; $i< count($wall); $i++) {
əks-səda "

".($i + 1).". ".$wall[$i]->mətn."
".date("Y-m-d H:i:s", $wall[$i]->tarix)."

"; // Qeydləri göstərin
}
?>

Gördüyünüz kimi, hər şey çox sadədir. Ən çətin hissəsi onu komponent elementlərinə bölməkdir. Mən nəticə çıxarmağa üstünlük verirəm API vasitəsilə çap_r, və yalnız bundan sonra bunun emalını yazın. Baxmayaraq ki, metodun təsvirində nümunə cavabına baxa və sonra təhlilçi yaza bilərsiniz.



Əlaqədar nəşrlər