Kuinka työskennellä VKontakte API:n kanssa. Yksinkertainen RESTful-palvelu alkuperäisessä PHP:ssä Mikä on api php:ssä

5. helmikuuta , 2017

En tiedä mitään PHP-kehystä. Tämä on surullista ja häpeällistä, mutta se ei ole vielä laissa kiellettyä. Mutta samalla haluan pelata REST API:lla. Ongelmana on, että php tukee oletuksena vain $_GET ja $_POST. RESTful-palvelua varten sinun on myös pystyttävä työskentelemään PUT-, DELETE- ja PATCH-toimintojen kanssa. Ja ei ole kovin ilmeistä, kuinka kulttuurisesti käsitellään monia pyyntöjä, kuten HANKI http://site.ru/users, POISTA http://site.ru/goods/5 ja muita röyhkeyttä. Kuinka kääriä kaikki tällaiset pyynnöt yhteen pisteeseen, jäsentää ne yleisesti osiin ja suorittaa tarvittava koodi tietojen käsittelemiseksi?

Lähes mikä tahansa PHP-kehys pystyy tekemään tämän heti. Esimerkiksi Laravel, jossa reititys toteutetaan selkeästi ja yksinkertaisesti. Mutta entä jos meidän ei tarvitse tutkia uutta suurta aihetta juuri nyt, vaan haluamme vain aloittaa projektin nopeasti REST API -tuella? Tästä keskustellaan artikkelissa.

Mitä RESTful-palvelumme pitäisi pystyä tekemään?

1. Tukee kaikkia 5 päätyyppiä pyyntöjä: GET, POST, PUT, PATCH, DELETE.
2. Ratkaise näkymän eri reitit
POSTITUS / tavarat
PUT /tavarat/(goodId)
HAE /käyttäjät/(userId)/info
ja muita mielivaltaisen pitkiä ketjuja.

Huomio: tämä artikkeli ei käsittele REST-sovellusliittymän perusteita
Oletan, että olet jo perehtynyt REST-lähestymistapaan ja ymmärrät kuinka se toimii. Jos ei, niin Internetissä on monia mahtavia artikkeleita RESTin perusteista - en halua kopioida niitä, ideani on näyttää kuinka RESTin kanssa työskennellä käytännössä.

Mitä toimintoja tuemme?

Tarkastellaan kahta kokonaisuutta - tuotteita ja käyttäjiä.

Tuotteille vaihtoehdot ovat seuraavat:

  • 1. HANKI /tavarat/(goodId)— Tietojen saaminen tuotteesta
  • 2. POSTITUS / tavarat- Uuden tuotteen lisääminen
  • 3. PUT /tavarat/(goodId)- Tuotteen muokkaaminen
  • 4. PATCH /goods/(goodId)— Joidenkin tuoteparametrien muokkaaminen
  • 5. POISTA /tavarat/(goodId)- Tuotteen poistaminen

Käyttäjille, monipuolisuuden vuoksi, harkitaan useita vaihtoehtoja GET:n kanssa

  • 1. HANKI /käyttäjät/(käyttäjätunnus)— Täydelliset tiedot käyttäjästä
  • 2. HAE /käyttäjät/(userId)/info— Vain yleistä tietoa käyttäjästä
  • 3. HANKI /käyttäjät/(userId)/tilaukset— Luettelo käyttäjien tilauksista

Miten tämä toimii alkuperäisen PHP:n kanssa?

Ensimmäinen asia, jonka teemme, on määrittää .htaccess niin, että kaikki pyynnöt ohjataan index.php-tiedostoon. Hän on se, joka osallistuu tietojen poimimiseen.

Toiseksi päätetään, mitä tietoja tarvitsemme, ja kirjoitetaan koodi saadaksemme ne - index.php:ssä.
Olemme kiinnostuneita 3 tyyppisestä datasta:

  • 1. Pyyntötapa (GET, POST, PUT, PATCH tai DELETE)
  • 2. URL-osoitteen tiedot, esimerkiksi käyttäjät/(käyttäjätunnus)/info – kaikki 3 parametria tarvitaan
  • 3. Pyynnön esittäneen elimen tiedot
Ja kolmanneksi kirjoitamme koodin, joka suorittaa tarvittavat toiminnot. Toiminnot on jaettu tiedostoihin, kaikki on Feng Shui, uusien polkujen ja menetelmien lisääminen RESTful-palveluun on hyvin yksinkertaista.

.htaccess

Luodaan .htaccess-tiedosto projektin juureen

RewriteEngine RewriteCond %(REQUEST_FILENAME) !-f RewriteRule ^(.+)$ index.php?q=$1

Näillä salaperäisillä linjoilla käskemme sinua tekemään tämän:
1 - lähetä kaikki pyynnöt king-tiedostoon index.php
2 - aseta URL-osoitteen merkkijono saataville index.php:ssä get-parametrissa q. Eli dataa URL-osoitteesta, kuten /käyttäjät/(userId)/info saamme $_GET["q"].

index.php

Katsotaanpa index.php:tä rivi riviltä. Otetaan ensin pyyntömenetelmä.

// Määritä pyyntömenetelmä $method = $_SERVER["REQUEST_METHOD"];

Sitten tiedot pyynnön elimestä

// Hae tiedot pyynnön rungosta $formData = getFormData($method);

GET:lle ja POST:lle on helppo hakea tietoja vastaavista $_GET- ja $_POST-taulukoista. Mutta muiden menetelmien suhteen sinun on oltava hieman perverssi. Niiden koodi vedetään streamista php://input, koodia on helppo Googlettaa, kirjoitin juuri yleisen kääreen - getFormData($method) -funktion

// Tietojen hakeminen pyynnön runkofunktiosta getFormData($method) ( // GET tai POST: palauttaa tiedot sellaisena kuin se on if ($method === "GET") return $_GET; if ($method === "POST" ) return $_POST // PUT, PATCH tai DELETE $data = array("&", file_get_contents("php://input") ($item = explode). ("=", $pari); if (count($item) == 2) ( $data = urldecode($item); ) ) return $data;

Eli saimme tarvittavat tiedot piilottamalla kaikki tiedot getFormDataan - hienoa. Siirrytään mielenkiintoisimpaan osaan - reitittämiseen.

// Jäsentää url $url = (isset($_GET["q"])) ? $_GET["q"] : ""; $url = rtrim($url, "/"); $urls = explode("/", $url);

Yllä opimme, että .htaccess asettaa URL-osoitteen parametrit $_GET-taulukon q-parametriin. Eli $_GET["q"] sisältää jotain tällaista: käyttäjät/10. Riippumatta siitä, mitä menetelmää käytämme pyynnön suorittamiseen.

A explode("/", $url) muuntaa tämän merkkijonon meille taulukoksi, jonka kanssa voimme jo työskennellä. Tee siis niin pitkiä kyselyketjuja kuin haluat, esim.
HANKI /goods/page/2/limit/10/sort/price_asc
Ja voit olla varma, että saat joukon

$urls = array("tavarat", "sivu", "2", "raja", "10", "lajitella", "hinta nouseva");

Nyt meillä on kaikki tiedot, ja meidän on tehtävä niille jotain hyödyllistä. Ja vain 4 riviä koodia tekee sen

// Määritä reititin ja url-tiedot $reititin = $urls; $urlData = array_slice($urls, 1); // Yhdistä reititintiedosto ja suorita päätoiminto include_once "routers/" . $reititin. ".php"; reitti($method, $urlData, $formData);

Ymmärrätkö? Luomme reitittimet kansion, johon laitamme tiedostot, jotka käsittelevät yhtä kokonaisuutta: tuotteita tai käyttäjiä. Samanaikaisesti olemme samaa mieltä siitä, että tiedostojen nimet ovat samat kuin urlData-parametrin ensimmäinen parametri - se on reititin, $router. Ja tämä reititin on poistettava urlDatasta, emme enää tarvitse sitä ja sitä käytetään vain vaaditun tiedoston yhdistämiseen. array_slice($urls, 1) ja antaa meille kaikki taulukon elementit ensimmäistä lukuun ottamatta.

Nyt ei jää muuta kuin yhdistää haluttu reititintiedosto ja suorittaa reittitoiminto kolmella parametrilla. Mikä tämä toimintoreitti on? Sovitaan, että jokaiseen reititintiedostoon määritellään toiminto, joka syöttöparametrien perusteella määrittää minkä toiminnon käyttäjä aloitti ja suorittaa vaaditun koodin. Nyt tämä tulee selvemmäksi. Tarkastellaan ensimmäistä pyyntöä - tietojen hankkimista tuotteesta.

HANKI /tavarat/(goodId)

Tiedosto routers/goods.php

// Reititinfunktio route($method, $urlData, $formData) ( // Tuotteen tietojen saaminen // GET /goods/(goodId) if ($method === "GET" && count($urlData) == = 1) ( // Hanki tuotteen tunnus $goodId = $urlData; // Vedä tuote pois tietokannasta... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => "GET", "id" => $goodId, "good" => "phone", "price" => 10000) // Return error header("HTTP/1.0 400 Bad Request"); error" => "Huono pyyntö") ") )

Tiedoston sisältö on yksi iso reittitoiminto, joka suorittaa tarvittavat toiminnot läpäistyistä parametreista riippuen. Jos GET-menetelmä ja 1 parametri (goodId) välitetään urlDatalle, tämä on pyyntö saada tietoja tuotteesta.

Huomio: esimerkki on hyvin yksinkertaistettu
Tosielämässä täytyy tietysti lisäksi tarkistaa syöttöparametrit, esimerkiksi että goodId on numero. Sen sijaan, että kirjoittaisit koodin tähän, sisällytät todennäköisesti vaaditun luokan. Ja saadaksesi tuotteen, luo tämän luokan objekti ja kutsu sille jokin menetelmä.
Tai ehkä voit siirtää ohjauksen jollekin ohjaimelle, joka jo huolehtii tarvittavien mallien alustamisesta. Vaihtoehtoja on monia, harkitsemme vain koodin yleistä rakennetta.

Vastauksessa asiakkaalle näytämme tarvittavat tiedot: tuotteen nimen ja sen hinnan. Tuotetunnus ja menetelmä ovat täysin valinnaisia ​​todellisessa sovelluksessa. Näytämme ne vain varmistaaksemme, että oikea menetelmä kutsutaan oikeilla parametreilla.

Kokeillaan esimerkillä: avaa selainkonsoli ja suorita koodi

$.ajax((url: "/examples/rest/goods/10", menetelmä: "GET", tietotyyppi: "json", menestys: function(response)(console.log("response:", vastaus))) )

Koodi lähettää pyynnön palvelimelle, jossa olen ottanut käyttöön samanlaisen sovelluksen, ja lähettää vastauksen. Varmista, että sinua kiinnostava reitti on /tavarat/10 todella toimi. Verkko-välilehdellä näet saman pyynnön.
Ja kyllä, /examples/rest on testisovelluksemme juuripolku sivustolle

Jos olet tottunut käyttämään curlia konsolissa, suorita tämä terminaalissa - vastaus on sama, ja jopa palvelimen otsikoilla.

Curl -X HANKI https://site/examples/rest/goods/10 -i

Toiminnon loppuun kirjoitimme seuraavan koodin.

// Palauttaa virheotsikon("HTTP/1.0 400 Bad Request"); echo json_encode(array("error" => "Virheellinen pyyntö"));

Se tarkoittaa, että jos olemme tehneet virheen parametrien kanssa tai pyydettyä reittiä ei ole määritetty, palautamme asiakkaalle 400 Bad Request -virheen. Lisää esimerkiksi jotain tällaista URL-osoitteeseen: tavarat/10/toinen_param ja näet virheen konsolissa ja 400-vastauksen - kiero pyyntö ei mennyt läpi.

Palvelimen vastausten http-koodien mukaan
Emme vaivaudu erilaisten koodien tulostamiseen, vaikka tämä kannattaa tehdä RESTin mukaan. Asiakasvirheitä on monia. Jopa yksinkertaisessa tapauksessamme 405 on sopiva, jos menetelmä on mennyt väärin. En halua tarkoituksella monimutkaistaa asioita.
Jos onnistuu, palvelimemme palauttaa aina 200 OK. Onneksi resurssia luotaessa kannattaa antaa 201 Created. Mutta jälleen kerran, yksinkertaistamisen kannalta hylkäämme nämä hienovaraisuudet, mutta todellisessa projektissa voit helposti toteuttaa ne itse.

Rehellisesti sanottuna artikkeli on valmis. Luulen, että ymmärrät jo lähestymistavan, kuinka kaikki reitit ratkaistaan, tietoja haetaan, kuinka niitä testataan, kuinka uusia pyyntöjä lisätään jne. Mutta täydentääkseni kuvaa annan loput 7 kyselyn toteutuksen, jotka esitimme artikkelin alussa. Teen matkan varrella pari mielenkiintoista kommenttia, ja lopuksi julkaisen arkiston lähdekoodilla.

POSTITUS / tavarat

Uuden tuotteen lisääminen

// Uuden tuotteen lisääminen // POST /goods if ($method === "POST" && empty($urlData)) ( // Tuotteen lisääminen tietokantaan... // Tulosta vastaus asiakkaalle echo json_encode (array("method" => "POST", "id" => rand(1, 100), "formData" => $formData));

urlData on nyt tyhjä, mutta formData on käytössä - näytämme sen asiakkaalle.

Miten se tehdään "oikein"?
RESTin kanonien mukaan lähetyspyynnössä tulee palauttaa vain luodun entiteetin tunnus tai url, jolla tämä entiteetti voidaan saada. Eli vastaus on joko vain numero - (goodId), tai /tavarat/(goodId).
Miksi kirjoitin lainausmerkeissä "oikein"? Kyllä, koska REST ei ole joukko tiukkoja sääntöjä, vaan suosituksia. Ja kuinka toteutat sen, riippuu mieltymyksistäsi tai jo hyväksytyistä sopimuksista tietystä projektista.
Muista vain, että toinen ohjelmoija, joka lukee koodia ja on tietoinen REST-lähestymistavasta, odottaa vastauksena post-pyyntöön luodun objektin id:n tai URL-osoitteen, josta tätä objektia koskevat tiedot voidaan hakea get-pyynnöllä.

Testaus konsolista

$.ajax((url: "/examples/rest/goods/", menetelmä: "POST", data: (hyvä: "muistikirja", hinta: 20000), dataType: "json", menestys: function(response)( console.log("vastaus:", vastaus))))

Curl -X POST https://site/examples/rest/goods/ --data "good=notebook&price=20000" -i

PUT /tavarat/(goodId)

Tuotteen muokkaaminen

// Päivitä kaikki tuotetiedot // PUT /goods/(goodId) if ($method === "PUT" && count($urlData) === 1) ( // Hanki tuotetunnus $goodId = $urlData; / / Päivitä kaikki tietokannan tuotekentät... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => "PUT", "id" => $goodId, "formData" => $formData)) ;

Täällä kaikki tiedot on jo käytetty täysimääräisesti. Tuotetunnus vedetään ulos urlDatasta ja ominaisuudet vedetään ulos formDatasta.

Testaus konsolista

$.ajax((url: "/examples/rest/goods/15", menetelmä: "PUT", data: (hyvä: "muistikirja", hinta: 20000), dataType: "json", menestys: function(response) (console.log("response:", vastaus))))

Curl -X PUT https://site/examples/rest/goods/15 --data "good=notebook&price=20000" -i

PATCH /goods/(goodId)

Osittainen tuotepäivitys

// Tuotetietojen osittainen päivitys // PATCH /goods/(goodId) if ($method === "PATCH" && count($urlData) === 1) ( // Hanki tuotteen tunnus $goodId = $urlData; // Päivitämme vain määritetyt tuotekentät tietokannassa... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => "PATCH", "id" => $goodId, "formData" => $formData));

Testaus konsolista

$.ajax((url: "/examples/rest/goods/15", menetelmä: "PATCH", data: (hinta: 25000), dataType: "json", menestys: function(response)(console.log(" vastaus:", vastaus))))

Curl -X PATCH https://site/examples/rest/goods/15 --data "price=25000" -i

Miksi kaikki tämä esittely PUT:n ja PATCHin kanssa?
Eikö yksi PUT riitä? Eivätkö he suorita samaa toimintoa - päivittää kohteen tiedot?
Aivan oikein – ulkoisesti toiminta on yhtä. Ero on lähetetyissä tiedoissa.
PUT olettaa sen Kaikki objektikentät ja PATCH - vain muuttunut. Pyynnön elimessä lähetetyt. Huomaa, että edellisessä PUT:ssa välitimme sekä tuotteen nimen että hinnan. Ja PATCHissa - vain hinta. Eli lähetimme palvelimelle vain muuttuneet tiedot.
Tarvitsetko PATCHia - päätä itse. Mutta muista se koodinlukuohjelmoija, jonka mainin yllä.

POISTA /tavarat/(goodId)

Tuotteen poistaminen

// Tuotteen poistaminen // POISTA /goods/(goodId) if ($method === "DELETE" && count($urlData) === 1) ( // Hanki tuotteen tunnus $goodId = $urlData; // Poista tuote tietokannasta... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => "DELETE", "id" => $goodId));

Testaus konsolista

$.ajax((url: "/examples/rest/goods/20", menetelmä: "DELETE", tietotyyppi: "json", menestys: function(response)(console.log("response:", vastaus))) )

Curl -X POISTA https://site/examples/rest/goods/20 -i

Kaikki on selvää DELETE-pyynnön kanssa. Katsotaan nyt työskentelyä käyttäjien kanssa - käyttäjien reititin ja vastaavasti users.php-tiedosto

HANKI /käyttäjät/(käyttäjätunnus)

Haetaan kaikkia käyttäjätietoja. Jos GET-pyyntö on kuin /käyttäjät/(käyttäjätunnus), niin palautamme kaikki käyttäjää koskevat tiedot, jos niitä on lisätty /tiedot tai /tilaukset, sitten vastaavasti vain yleisiä tietoja tai luettelo tilauksista.

// Reititinfunktio route($method, $urlData, $formData) ( // Kaiken tiedon saaminen käyttäjästä // GET /users/(userId) if ($method === "GET" && count($urlData) = = = 1) ( // Hanki tuotetunnus $userId = $urlData; // Pura kaikki käyttäjää koskevat tiedot tietokannasta... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => " GET", "id" = > $userId, "info" => array("email" => " [sähköposti suojattu]", "nimi" => "Webdevkin"), "tilaukset" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array (" orderId" => 8, "summa" => 5000, "orderDate" => "02/03/2017"))) return ) // Palauttaa virheen otsikon ("HTTP/1.0 400 Bad Request"); ); echo json_encode( array("error" => "Bad Request"));

Testaus konsolista

$.ajax((url: "/examples/rest/users/5", menetelmä: "GET", tietotyyppi: "json", menestys: function(response)(console.log("response:", vastaus))) )

Curl -X GET https://site/examples/rest/users/5 -i

HAE /käyttäjät/(userId)/info

Yleistä tietoa käyttäjästä

// Yleisten tietojen hankkiminen käyttäjästä // HANKI /käyttäjät/(userId)/info if ($method === "GET" && count($urlData) === 2 && $urlData === "info") ( / / Hae tuotteen tunnus $userId = $urlData // Poimi yleiset tiedot käyttäjästä... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => "GET", "id; " => $userId, " info" => array("email" => " [sähköposti suojattu]", "nimi" => "Webdevkin"))); paluu; )

Testaus konsolista

$.ajax((url: "/examples/rest/users/5/info", menetelmä: "GET", tietotyyppi: "json", menestys: function(response)(console.log("response:", vastaus) )))

Curl -X HANKI https://site/examples/rest/users/5/info -i

HANKI /käyttäjät/(käyttäjätunnus)/tilaukset

Luettelon saaminen käyttäjien tilauksista

// Vastaanota käyttäjien tilauksia // HANKI /käyttäjät/(userId)/tilaukset if ($method === "GET" && count($urlData) === 2 && $urlData === "tilauksia") ( // Hanki tuotteen tunnus $userId = $urlData // Hae tiedot käyttäjän tilauksista tietokannasta... // Tulosta vastaus asiakkaalle echo json_encode(array("method" => "GET", "id" => $; userId, "tilaukset" => array(array("orderId" => 5, "summa" => 2000, "orderDate" => "01/12/2017"), array("orderId" => 8, "summa" " => 5000, "orderDate " => "02/03/2017")))); paluu; )

Testaus konsolista

$.ajax((url: "/examples/rest/users/5/orders", menetelmä: "GET", tietotyyppi: "json", menestys: function(response)(console.log("response:", vastaus)) )))

Curl -X HANKI https://site/examples/rest/users/5/orders -i

Tulokset ja lähteet

Lähteet artikkeliesimerkeistä -

Kuten näette, REST API -tuen järjestäminen alkuperäisessä php:ssä ei osoittautunut niin vaikeaksi ja täysin lailliseksi. Tärkeintä on tuki reiteille ja epästandardeille PHP-menetelmille PUT, PATCH ja DELETE.

Tämän tuen toteuttava pääkoodi mahtuu 3 tusinaan index.php-riville. Loput ovat vain valjaita, jotka voidaan toteuttaa haluamallasi tavalla. Ehdotin tämän tekemistä plug-in-reititintiedostojen muodossa, joiden nimet vastaavat projektisi kokonaisuuksia. Mutta voit käyttää mielikuvitustasi ja löytää mielenkiintoisemman ratkaisun.

Projektia kehitettäessä törmäsin tarpeeseen organisoida iOS- ja Android-alustojen sovellusten asiakas-palvelin-vuorovaikutus verkkosivustoni kanssa, jolle kaikki tiedot on tallennettu - varsinainen mysql-tietokanta, kuvat, tiedostot ja muu sisältö.
Ongelmat, jotka piti ratkaista, olivat melko yksinkertaisia:
käyttäjän rekisteröinti/valtuutus;
tiettyjen tietojen (esimerkiksi tuoteluettelon) lähettäminen/vastaanottaminen.

Ja sitten halusin kirjoittaa oman API:n vuorovaikutukseen palvelinpuolen kanssa - lähinnä käytännön mielenkiinnon vuoksi.

Syötä tiedot

Minulla oli käytössäni:
Palvelin - Apache, PHP 5.0, MySQL 5.0
Asiakas - Android-, iOS-laitteet, mikä tahansa selain

Päätin, että käytän JSON-tietomuotoa palvelimelle lähetettäviin pyyntöihin ja sen vastauksiin - sen yksinkertaisuuden ja alkuperäisen tuen vuoksi PHP:ssä ja Androidissa. Täällä iOS järkytti minua - sillä ei ole alkuperäistä JSON-tukea (tässä minun piti käyttää kolmannen osapuolen kehitystä).

Päätettiin myös, että pyynnöt voitiin lähettää sekä GET- että POST-pyyntöjen kautta (tässä auttoi PHP:n $_REQUEST). Tämä ratkaisu mahdollisti API:n testaamisen GET-pyyntöjen kautta missä tahansa käytettävissä olevassa selaimessa.

Kyselyt päätettiin näyttää tältä:
http://[palvelimen osoite]/[polku api-kansioon]/?[api_name].[method_name]=

Polku api-kansioon on hakemisto, johon sinun tulee tehdä pyyntöjä, jonka juuressa on index.php-tiedosto - se vastaa toimintojen kutsumisesta ja virheiden käsittelystä
Nimeä api - mukavuuden vuoksi päätin erottaa API-ryhmät - käyttäjä, tietokanta, sisältö jne. Tässä tapauksessa jokainen API sai oman nimensä
Menetelmän nimi - menetelmän nimi, joka on kutsuttava määritetyssä sovellusliittymässä
JSON - JSON-objektin merkkijonoesitys menetelmäparametreille

Skeleton API

Palvelinpuolen API-runko koostuu useista perusluokista:
index.php - Apachen hakemiston hakemistotiedosto sisältää kaikki API-kutsut, jäsentää parametrit ja kutsuu API-menetelmiä
MySQLiWorker - yksi luokka MySQL-tietokannan kanssa työskentelemiseen MySQLin kautta
apiBaseCalss.php on pääluokka kaikille järjestelmän sovellusliittymille – jokaisen API:n on perittävä tämä luoka toimiakseen oikein
apiEngine.php - järjestelmän pääluokka - jäsentää läpäistyt parametrit (ennen indeks.php:n jäsentämisen jälkeen), yhdistää vaaditun api-luokan (required_once -metodin kautta), kutsuu siinä vaaditun menetelmän ja palauttaa tuloksen JSONissa muoto
apiConstants.php - luokka, jossa on vakiot api-kutsuja ja virheiden lähetystä varten
apitest.php - testaa api uusien menetelmien testaamiseen ennen niiden sisällyttämistä tuotantoversioon

Koko mekanismi näyttää tältä:
Teemme pyynnön palvelimelle - esimerkiksi www.example.com/api/?apitest.helloWorld= ()
Palvelinpuolella index.php-tiedosto jäsentää välitetyt parametrit. Index.php ottaa aina vain ensimmäisen elementin ohitettujen $_REQUEST-parametrien luettelosta - tämä tarkoittaa, että rakenne, kuten www.example.com/api/?apitest.helloWorld= ()&apitest.helloWorld2 - kutsuu vain helloWorld-metodia apitest. helloWorld2-menetelmää ei kutsuta

Nyt lisätietoja jokaisesta

Yritin dokumentoida tiedostot tarpeeksi, jotta ne eivät vie paljon tilaa tekstille. Kuitenkin niissä tiedostoissa, joissa ei ole kommentteja, annan silti kuvauksen.

Index.php

Kuten sanoin aiemmin, tämä on Apachen syöttöhakemistotiedosto, mikä tarkoittaa, että se hyväksyy kaikki puhelut, kuten www.example.com/api.

0)( request_once "apiEngine.php"; foreach ($_REQUEST as $apiFunctionName => $apiFunctionParams) ( $APIEngine=uusi APIEngine($apiFunctionName,$apiFunctionParams); echo $APIEngine->callApiFunction ();callApiFunction) ( $jsonError->error="Ei toimintoa kutsuttu"; echo json_encode($jsonError); ) ?>

Ensinnäkin asetamme sisältötyypin - text/html (voit sitten muuttaa sitä itse menetelmissä) ja koodauksen - UTF-8.
Seuraavaksi tarkistamme, että he pyytävät meiltä jotain. Jos ei, tulostamme JSON-tiedoston virheellä.
Jos pyyntöparametreja on, yhdistämme API-moottoritiedoston - apiEngine.php ja luomme moottoriluokan hyväksytyillä parametreilla ja kutsumme api-metodia.
Poistumme silmukasta, koska päätimme käsitellä vain yhden puhelun.

apiEngine.php

Toiseksi tärkein luokka on apiEngine-luokka - se on moottori api:n ja niiden menetelmien kutsumiseen.
apiFunctionParams = stripcslashes($apiFunctionParams); //Järjestele kahden elementin taulukko - API:n nimi, - API:n menetelmän nimi $this->apiFunctionName = explode("_", $apiFunctionName); ) //Luo JSON-vastausfunktio createDefaultJson() ( $retObject = json_decode("()"); $response = APIConstants::$RESPONSE; $retObject->$response = json_decode("()"); return $retObject ; ) rekisteröi if (file_exists($apiName . ".php")) ( $apiClass = APIEngine::getApiEngineByName($apiName); // Hanki API-objekti $apiReflection = new ReflectionClass($apiName); // ReflectionClass($apiName) saamme tietoa luokan try -objektista ( $functionName = $this->apiFunctionName;//Menetelin nimi, jolla $apiReflection->getMethod($functionName) kutsutaan;//Tarkista metodin $response = APIConstants olemassaolo: :$RESPONSE $jsonParams = json_decode($this- >apiFunctionParams) ei JSON, vaan binääritiedot, kuten zip, png ja muu sisältö, palauttavat $apiClass->$functionName($jsonParams);//Kutsu menetelmää API:ssa )else( $resultFunctionCall->$response = $apiClass->$functionName ($jsonParams);//Kutsu sovellusliittymässä menetelmää, joka palauttaa JSON-objektin) ) else ( //Jos JSON-pyyntöparametrien dekoodauksessa on virhe $resultFunctionCall->errno = APIConstants::$ERROR_ENGINE_PARAMS; $resultFunctionCall->error = "Virhe annetuissa parametreissa"; ) ) catch (Poikkeus $ex) ( //Odottamaton poikkeus $resultFunctionCall->error = $ex->getMessage(); ) ) else ( //Jos pyydettyä API:ta ei löydy $resultFunctionCall->errno = APIConstants::$ ERROR_ENGINE_PARAMS; $resultFunctionCall->error = "Tiedostoa ei löydy" $resultFunctionCall->REQUEST = $_REQUEST ) return json_encode($resultFunctionCall); ) ) ?>

apiConstants.php

Tätä luokkaa käytetään vain vakioiden tallentamiseen.

MySQLiWorker.php

Yksi luokka tietokannan kanssa työskentelemiseen. Muuten tämä on tavallinen yksinäinen - Internetissä on paljon tällaisia ​​esimerkkejä.

dbName = $dbName; self::$instance->dbHost = $dbHost; self::$instance->dbUser = $dbUser; self::$instance->dbPassword = $dbPassword; self::$instance->openConnection(); ) palauttaa itsensä::$instance; ) //Määritä tietokantaan kyselyparametrien tyypit ja palauta merkkijono sitomista varten ->bind-funktion kautta preparatParams($params) ( $retSTMTString = ""; foreach ($params $arvona) (if (is_int( $arvo) ||. is_double ($arvo)) ( $retSTMTString.="d"; ) if (on_string($value)) ( $retSTMTString.="s"; ) ) palauttaa $retSTMTString ) //Yhdistä tietokannan julkinen toiminto openConnection() ( if (is_null($this->connectLink)) ( $this->connectLink = new mysqli($this->dbHost, $this->dbUser, $this->dbPassword, $this-> dbName); $this-> connectLink->query("SET NAMES utf8") (mysqli_connect_errno()) ( printf("Yhteys ei mahdollista: %s\n", mysqli_connect_error()); null; ) else ( mysqli_report(MYSQLI_REPORT_ERROR ); ) ) return $this->connectLink ) //Sulje yhteys tietokantaan public function closeConnection() ( if (!is_null($this->connectLink); >connectLink->close(); $kentät = array(); $out = array(); $kentät = $stmt; $määrä = 1; $currentTable = ""; while ($field = mysqli_fetch_field($data)) ( if (strlen($currentTable) == 0) ( $currentTable = $field-> table; ) $fields[$count] = &$out[$field->nimi ]; $count++ ) call_user_func_array("mysqli_stmt_bind_result", $fields); ) ) ?>

apiBaseClass.php

No, tulemme yhteen järjestelmän tärkeimmistä luokista - perusluokkaan kaikille järjestelmän API:ille.

mySQLWorker = MySQLiWorker::getInstance($dbName,$dbHost,$dbUser,$dbPassword); ) ) function __destruct() ( if (isset($this->mySQLWorker))( //Jos tietokantaan muodostettiin yhteys, $this->mySQLWorker->closeConnection(); //sulje se, kun luokkamme on ei enää tarvita ) ) //Luo oletus-JSON vastausfunktiolle createDefaultJson() ( $retObject = json_decode("()"); return $retObject; ) //Täytä JSON-objekti vastauksella MySQLiWorker-funktiosta fillJSON(&$ jsonObject, &$stmt, &$mySQLWorker) ( $rivi = array(); $mySQLWorker->stmt_bind_assoc($stmt, $row); while ($stmt->fetch()) ( foreach ($row as $key = > $arvo) ($-avain = strtolower($avain); $jsonObject->$key = $arvo; ) palauttaa $jsonObject;

Kuten näet, tämä luokka sisältää useita "hyötymenetelmiä", kuten:
konstruktori, jossa yhteys tietokantaan muodostetaan, jos nykyinen API tulee toimimaan tietokannan kanssa;
destructor - valvoo resurssien vapautumista - katkaisee muodostetun yhteyden tietokantaan
createDefaultJson - luo oletus-JSON-koodin menetelmävastaukselle
fillJSON - jos oletetaan, että pyyntö palauttaa vain yhden tietueen, tämä menetelmä täyttää vastauksen JSON:n tiedoilla tietokannan vastauksen ensimmäiseltä riviltä

Luodaan oma API

Se on itse asiassa tämän API:n koko selkäranka. Katsotaanpa nyt kuinka käyttää kaikkea tätä esimerkkinä ensimmäisen API:n luomisesta nimeltä apitest. Ja kirjoitetaan siihen pari yksinkertaista funktiota:
yksi ilman parametreja
yhden parametrien kanssa ja hän palauttaa ne meille, jotta on selvää, että hän on lukenut ne
joka palauttaa meille binääritietoja

Ja niin luomme luokan apitest.php, jolla on seuraava sisältö

createDefaultJson(); $retJSON->withoutParams = "Se menetelmä kutsutaan ilman parametreja"; palauttaa $retJSON; ) //http://www.example.com/api/?apitest.helloAPIWithParams=("TestParamOne":"Ensimmäisen teksti parametri") function helloAPIWithParams($apiMethodParams) ( $retJSON = $this->createDefaultJson(); if (isset($apiMethodParams->TestParamOne))( //Kaikki on ok, parametrit ovat oikein, palautamme ne $retJSON ->retParameter=$ apiMethodParams->TestParamOne )else( $retJSON->errorno= APIConstants::$ERROR_PARAMS; ) return $retJSON ) //http://www.example.com/api/?apitest.helloAPIResponse; ("responseBinary": 1) funktio helloAPIResponseBinary($apiMethodParams)( header("Content-type: image/png"); echo file_get_contents("http://habrahabr.ru/i/error-404-monster.jpg") ; ) ) ?>

Testausmenetelmien helpottamiseksi lisään niihin osoitteen, josta voin tehdä nopean testauspyynnön.

Ja niin meillä on kolme tapaa

Funktio helloAPI() ( $retJSON = $this->createDefaultJson(); $retJSON->withoutParams = "Se menetelmä kutsutaan ilman parametreja"; palauttaa $retJSON; )

Tämä on yksinkertainen menetelmä ilman parametreja. Sen osoite GET-puhelulle on www.example.com/api/?apitest.helloAPI= ()

Suorituksen tulos on tällainen sivu (selaimessa)

Tämä menetelmä ottaa parametrit. TestParamOne vaaditaan, ja me tarkistamme sen. Sitä ei voi lähettää, JSON palautetaan virheellä

Funktio helloAPIWithParams($apiMethodParams) ( $retJSON = $this->createDefaultJson(); if (isset($apiMethodParams->TestParamOne))( //Kaikki on ok, parametrit ovat oikein, palautamme ne $retJSON->retParameter =$apiMethodParams-> TestParamOne )else( $retJSON->errorno= APIConstants::$ERROR_PARAMS; ) palauttaa $retJSON;
Toteutustulos

helloAPIResponseBinary

Ja viimeinen menetelmä helloAPIResponseBinary - palauttaa binääritiedot - kuvan habrista olemattomasta sivusta (esimerkkinä)
funktio helloAPIResponseBinary($apiMethodParams)( header("Content-type: image/jpeg"); echo file_get_contents("http://habrahabr.ru/i/error-404-monster.jpg"); )
Kuten näet, otsikko on korvattu graafisen sisällön näyttämiseksi.
Tulos tulee olemaan tällainen

Projektia kehitettäessä törmäsin tarpeeseen organisoida iOS- ja Android-alustojen sovellusten asiakas-palvelin-vuorovaikutus verkkosivustoni kanssa, jolle kaikki tiedot on tallennettu - varsinainen mysql-tietokanta, kuvat, tiedostot ja muu sisältö.
Ongelmat, jotka piti ratkaista, olivat melko yksinkertaisia:
käyttäjän rekisteröinti/valtuutus;
tiettyjen tietojen (esimerkiksi tuoteluettelon) lähettäminen/vastaanottaminen.

Ja sitten halusin kirjoittaa oman API:n vuorovaikutukseen palvelinpuolen kanssa - lähinnä käytännön mielenkiinnon vuoksi.

Syötä tiedot

Minulla oli käytössäni:
Palvelin - Apache, PHP 5.0, MySQL 5.0
Asiakas - Android-, iOS-laitteet, mikä tahansa selain

Päätin, että käytän JSON-tietomuotoa palvelimelle lähetettäviin pyyntöihin ja sen vastauksiin - sen yksinkertaisuuden ja alkuperäisen tuen vuoksi PHP:ssä ja Androidissa. Täällä iOS järkytti minua - sillä ei ole alkuperäistä JSON-tukea (tässä minun piti käyttää kolmannen osapuolen kehitystä).

Päätettiin myös, että pyynnöt voitiin lähettää sekä GET- että POST-pyyntöjen kautta (tässä auttoi PHP:n $_REQUEST). Tämä ratkaisu mahdollisti API:n testaamisen GET-pyyntöjen kautta missä tahansa käytettävissä olevassa selaimessa.

Kyselyt päätettiin näyttää tältä:
http://[palvelimen osoite]/[polku api-kansioon]/?[api_name].[method_name]=

Polku api-kansioon on hakemisto, johon sinun tulee tehdä pyyntöjä, jonka juuressa on index.php-tiedosto - se vastaa toimintojen kutsumisesta ja virheiden käsittelystä
Nimeä api - mukavuuden vuoksi päätin erottaa API-ryhmät - käyttäjä, tietokanta, sisältö jne. Tässä tapauksessa jokainen API sai oman nimensä
Menetelmän nimi - menetelmän nimi, joka on kutsuttava määritetyssä sovellusliittymässä
JSON - JSON-objektin merkkijonoesitys menetelmäparametreille

Skeleton API

Palvelinpuolen API-runko koostuu useista perusluokista:
index.php - Apachen hakemiston hakemistotiedosto sisältää kaikki API-kutsut, jäsentää parametrit ja kutsuu API-menetelmiä
MySQLiWorker - yksi luokka MySQL-tietokannan kanssa työskentelemiseen MySQLin kautta
apiBaseCalss.php on pääluokka kaikille järjestelmän sovellusliittymille – jokaisen API:n on perittävä tämä luoka toimiakseen oikein
apiEngine.php - järjestelmän pääluokka - jäsentää läpäistyt parametrit (ennen indeks.php:n jäsentämisen jälkeen), yhdistää vaaditun api-luokan (required_once -metodin kautta), kutsuu siinä vaaditun menetelmän ja palauttaa tuloksen JSONissa muoto
apiConstants.php - luokka, jossa on vakiot api-kutsuja ja virheiden lähetystä varten
apitest.php - testaa api uusien menetelmien testaamiseen ennen niiden sisällyttämistä tuotantoversioon

Koko mekanismi näyttää tältä:
Teemme pyynnön palvelimelle - esimerkiksi www.example.com/api/?apitest.helloWorld= ()
Palvelinpuolella index.php-tiedosto jäsentää välitetyt parametrit. Index.php ottaa aina vain ensimmäisen elementin ohitettujen $_REQUEST-parametrien luettelosta - tämä tarkoittaa, että rakenne, kuten www.example.com/api/?apitest.helloWorld= ()&apitest.helloWorld2 - kutsuu vain helloWorld-metodia apitest. helloWorld2-menetelmää ei kutsuta

Nyt lisätietoja jokaisesta

Yritin dokumentoida tiedostot tarpeeksi, jotta ne eivät vie paljon tilaa tekstille. Kuitenkin niissä tiedostoissa, joissa ei ole kommentteja, annan silti kuvauksen.

Index.php

Kuten sanoin aiemmin, tämä on Apachen syöttöhakemistotiedosto, mikä tarkoittaa, että se hyväksyy kaikki puhelut, kuten www.example.com/api.

0)( request_once "apiEngine.php"; foreach ($_REQUEST as $apiFunctionName => $apiFunctionParams) ( $APIEngine=uusi APIEngine($apiFunctionName,$apiFunctionParams); echo $APIEngine->callApiFunction ();callApiFunction) ( $jsonError->error="Ei toimintoa kutsuttu"; echo json_encode($jsonError); ) ?>

Ensinnäkin asetamme sisältötyypin - text/html (voit sitten muuttaa sitä itse menetelmissä) ja koodauksen - UTF-8.
Seuraavaksi tarkistamme, että he pyytävät meiltä jotain. Jos ei, tulostamme JSON-tiedoston virheellä.
Jos pyyntöparametreja on, yhdistämme API-moottoritiedoston - apiEngine.php ja luomme moottoriluokan hyväksytyillä parametreilla ja kutsumme api-metodia.
Poistumme silmukasta, koska päätimme käsitellä vain yhden puhelun.

apiEngine.php

Toiseksi tärkein luokka on apiEngine-luokka - se on moottori api:n ja niiden menetelmien kutsumiseen.
apiFunctionParams = stripcslashes($apiFunctionParams); //Järjestele kahden elementin taulukko - API:n nimi, - API:n menetelmän nimi $this->apiFunctionName = explode("_", $apiFunctionName); ) //Luo JSON-vastausfunktio createDefaultJson() ( $retObject = json_decode("()"); $response = APIConstants::$RESPONSE; $retObject->$response = json_decode("()"); return $retObject ; ) rekisteröi if (file_exists($apiName . ".php")) ( $apiClass = APIEngine::getApiEngineByName($apiName); // Hanki API-objekti $apiReflection = new ReflectionClass($apiName); // ReflectionClass($apiName) saamme tietoa luokan try -objektista ( $functionName = $this->apiFunctionName;//Menetelin nimi, jolla $apiReflection->getMethod($functionName) kutsutaan;//Tarkista metodin $response = APIConstants olemassaolo: :$RESPONSE $jsonParams = json_decode($this- >apiFunctionParams) ei JSON, vaan binääritiedot, kuten zip, png ja muu sisältö, palauttavat $apiClass->$functionName($jsonParams);//Kutsu menetelmää API:ssa )else( $resultFunctionCall->$response = $apiClass->$functionName ($jsonParams);//Kutsu sovellusliittymässä menetelmää, joka palauttaa JSON-objektin) ) else ( //Jos JSON-pyyntöparametrien dekoodauksessa on virhe $resultFunctionCall->errno = APIConstants::$ERROR_ENGINE_PARAMS; $resultFunctionCall->error = "Virhe annetuissa parametreissa"; ) ) catch (Poikkeus $ex) ( //Odottamaton poikkeus $resultFunctionCall->error = $ex->getMessage(); ) ) else ( //Jos pyydettyä API:ta ei löydy $resultFunctionCall->errno = APIConstants::$ ERROR_ENGINE_PARAMS; $resultFunctionCall->error = "Tiedostoa ei löydy" $resultFunctionCall->REQUEST = $_REQUEST ) return json_encode($resultFunctionCall); ) ) ?>

apiConstants.php

Tätä luokkaa käytetään vain vakioiden tallentamiseen.

MySQLiWorker.php

Yksi luokka tietokannan kanssa työskentelemiseen. Muuten tämä on tavallinen yksinäinen - Internetissä on paljon tällaisia ​​esimerkkejä.

dbName = $dbName; self::$instance->dbHost = $dbHost; self::$instance->dbUser = $dbUser; self::$instance->dbPassword = $dbPassword; self::$instance->openConnection(); ) palauttaa itsensä::$instance; ) //Määritä tietokantaan kyselyparametrien tyypit ja palauta merkkijono sitomista varten ->bind-funktion kautta preparatParams($params) ( $retSTMTString = ""; foreach ($params $arvona) (if (is_int( $arvo) ||. is_double ($arvo)) ( $retSTMTString.="d"; ) if (on_string($value)) ( $retSTMTString.="s"; ) ) palauttaa $retSTMTString ) //Yhdistä tietokannan julkinen toiminto openConnection() ( if (is_null($this->connectLink)) ( $this->connectLink = new mysqli($this->dbHost, $this->dbUser, $this->dbPassword, $this-> dbName); $this-> connectLink->query("SET NAMES utf8") (mysqli_connect_errno()) ( printf("Yhteys ei mahdollista: %s\n", mysqli_connect_error()); null; ) else ( mysqli_report(MYSQLI_REPORT_ERROR ); ) ) return $this->connectLink ) //Sulje yhteys tietokantaan public function closeConnection() ( if (!is_null($this->connectLink); >connectLink->close(); $kentät = array(); $out = array(); $kentät = $stmt; $määrä = 1; $currentTable = ""; while ($field = mysqli_fetch_field($data)) ( if (strlen($currentTable) == 0) ( $currentTable = $field-> table; ) $fields[$count] = &$out[$field->nimi ]; $count++ ) call_user_func_array("mysqli_stmt_bind_result", $fields); ) ) ?>

apiBaseClass.php

No, tulemme yhteen järjestelmän tärkeimmistä luokista - perusluokkaan kaikille järjestelmän API:ille.

mySQLWorker = MySQLiWorker::getInstance($dbName,$dbHost,$dbUser,$dbPassword); ) ) function __destruct() ( if (isset($this->mySQLWorker))( //Jos tietokantaan muodostettiin yhteys, $this->mySQLWorker->closeConnection(); //sulje se, kun luokkamme on ei enää tarvita ) ) //Luo oletus-JSON vastausfunktiolle createDefaultJson() ( $retObject = json_decode("()"); return $retObject; ) //Täytä JSON-objekti vastauksella MySQLiWorker-funktiosta fillJSON(&$ jsonObject, &$stmt, &$mySQLWorker) ( $rivi = array(); $mySQLWorker->stmt_bind_assoc($stmt, $row); while ($stmt->fetch()) ( foreach ($row as $key = > $arvo) ($-avain = strtolower($avain); $jsonObject->$key = $arvo; ) palauttaa $jsonObject;

Kuten näet, tämä luokka sisältää useita "hyötymenetelmiä", kuten:
konstruktori, jossa yhteys tietokantaan muodostetaan, jos nykyinen API tulee toimimaan tietokannan kanssa;
destructor - valvoo resurssien vapautumista - katkaisee muodostetun yhteyden tietokantaan
createDefaultJson - luo oletus-JSON-koodin menetelmävastaukselle
fillJSON - jos oletetaan, että pyyntö palauttaa vain yhden tietueen, tämä menetelmä täyttää vastauksen JSON:n tiedoilla tietokannan vastauksen ensimmäiseltä riviltä

Luodaan oma API

Se on itse asiassa tämän API:n koko selkäranka. Katsotaanpa nyt kuinka käyttää kaikkea tätä esimerkkinä ensimmäisen API:n luomisesta nimeltä apitest. Ja kirjoitetaan siihen pari yksinkertaista funktiota:
yksi ilman parametreja
yhden parametrien kanssa ja hän palauttaa ne meille, jotta on selvää, että hän on lukenut ne
joka palauttaa meille binääritietoja

Ja niin luomme luokan apitest.php, jolla on seuraava sisältö

createDefaultJson(); $retJSON->withoutParams = "Se menetelmä kutsutaan ilman parametreja"; palauttaa $retJSON; ) //http://www.example.com/api/?apitest.helloAPIWithParams=("TestParamOne":"Ensimmäisen teksti parametri") function helloAPIWithParams($apiMethodParams) ( $retJSON = $this->createDefaultJson(); if (isset($apiMethodParams->TestParamOne))( //Kaikki on ok, parametrit ovat oikein, palautamme ne $retJSON ->retParameter=$ apiMethodParams->TestParamOne )else( $retJSON->errorno= APIConstants::$ERROR_PARAMS; ) return $retJSON; //http://www.example.com/api/?apitest..jpg" ); ) ) ?>

Testausmenetelmien helpottamiseksi lisään niihin osoitteen, josta voin tehdä nopean testauspyynnön.

Ja niin meillä on kolme tapaa

Funktio helloAPI() ( $retJSON = $this->createDefaultJson(); $retJSON->withoutParams = "Se menetelmä kutsutaan ilman parametreja"; palauttaa $retJSON; )

Tämä on yksinkertainen menetelmä ilman parametreja. Sen osoite GET-puhelulle on www.example.com/api/?apitest.helloAPI= ()

Suorituksen tulos on tällainen sivu (selaimessa)

Tämä menetelmä ottaa parametrit. TestParamOne vaaditaan, ja me tarkistamme sen. Sitä ei voi lähettää, JSON palautetaan virheellä

Funktio helloAPIWithParams($apiMethodParams) ( $retJSON = $this->createDefaultJson(); if (isset($apiMethodParams->TestParamOne))( //Kaikki on ok, parametrit ovat oikein, palautamme ne $retJSON->retParameter =$apiMethodParams-> TestParamOne )else( $retJSON->errorno= APIConstants::$ERROR_PARAMS; ) palauttaa $retJSON;
Toteutustulos

helloAPIResponseBinary

Ja viimeinen menetelmä helloAPIResponseBinary - palauttaa binääritiedot - kuvan habrista olemattomasta sivusta (esimerkkinä)
funktio helloAPIResponseBinary($apiMethodParams)( header("Sisältötyyppi: kuva/jpeg"); echo file_get_contents("http://site/i/error-404-hirviö.jpg"); )
Kuten näet, otsikko on korvattu graafisen sisällön näyttämiseksi.
Tulos tulee olemaan tällainen

Minulta kysytään usein kuinka työskennellä API:n kanssa. Suosituin ongelma, joka liittyy API, On - työskentelee VKontakte API:n kanssa. Tässä artikkelissa näytän kuinka työskennellä VKontakte API:n kanssa, ja mikä tärkeintä, näytän sinulle sen kaikki API:t toimivat saman periaatteen mukaisesti.

Tässä menettelyä jotka sinun on tehtävä voidaksesi tehdä aloita työskentely minkä tahansa API:n kanssa:

  1. löytö dokumentointi tarvittaessa API.
  2. Katso API-yhteysesimerkkejä. Tässä voi olla erilaisia ​​vaihtoehtoja. Esimerkiksi yksi palvelu vaatii salaisen avaimen, joka myönnetään rekisteröinnin jälkeen. Toisessa palvelussa kaikki pyynnöt eivät vaadi salaisia ​​avaimia. Kolmannessa palvelussa on vaihtoehtoja työskennellä salaisen avaimen kanssa ja ilman. Joskus salaista avainta kutsutaan merkki.
  3. Kopio yksinkertainen valmis koodi dokumentaatiosivustolta ja tarkista sen toiminta. Jos se ei toimi, etsi virhe itse, koska palvelulla ei todennäköisesti sellaista ole.
  4. löytö dokumentaatiossa menetelmä, joka ratkaisee ongelmasi.
  5. Käyttämällä esimerkkejä ja menetelmän kuvausta, lähetä oikea pyyntö API:lle.
  6. Riippuen vastauksen muodosta, jäsennä se muotoon " komponentit", ja tee sitten mitä tarvitaan - näytä se käyttäjälle, tallenna se tiedostoon, lähetä se tietokantaan ja niin edelleen.

Ja esimerkkinä näiden ohjeiden noudattamisesta tarkastelemme VKontakte API. Niin:

  1. Linkki dokumentointi.
  2. Tässä tapauksessa on olemassa menetelmiä, jotka ovat julkisia eivätkä siksi vaadi tunnusmerkkiä, ja on menetelmiä, jotka vaativat sellaisen.
  3. Tässä tapauksessa en löytänyt esimerkkejä tietyllä kielellä. Ehkä ne ovat siellä, mutta eivät selvästikään näkyvissä. Yleensä klo API Jokaisesta menetelmästä on esimerkkejä eri kielillä.
  4. Haluamme vetäytyä 5 viimeisintä viestiä tietyn käyttäjän seinältä ja näytä ne sitten verkkosivustollasi. Tarvittava menetelmä.

Nyt meidän täytyy lähetä pyyntö API:lle menetelmän kuvauksen avulla. Teemme tämän läpi PHP:

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

Tässä tapauksessa käytän API 5.3 (v=5.3), näytän kaikki merkinnät tekijästä riippumatta ( suodatin = muut) sivultasi ( domain=myrusakov) määrässä 5 asiat ( count = 5). Minusta täällä kaikki on hyvin läpinäkyvää.

Saimme vastauksen muodossa JSON, ja nyt meidän on siirryttävä viimeiseen kohtaan - jäsennetään vastaus kysymykseen " komponentit Seuraavaksi näytämme seinältä tulevat viestit enemmän tai vähemmän luettavassa muodossa verkkosivustomme sivulla. PHP koodi:

$wall = file_get_contents("http://api.vk.com/method/wall.get?v=5.3&filter=others&domain=myrusakov&count=5"); // Lähetä pyyntö
$seinä = json_decode($seinä); // Muunna JSON-merkkijono taulukoksi
$seinä = $seinä->vastaus->kohteet; // Hanki joukko kommentteja
for ($i = 0; $i< count($wall); $i++) {
kaiku"

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

"; // Näytä tietueet
}
?>

Kuten näet, kaikki on hyvin yksinkertaista. Vaikein osa on hajottaa se komponenttielementteihinsä. Haluan tulostaa tuloksen API kautta print_r, ja vasta sitten kirjoittaa tämän käsittelyn. Vaikka voit katsoa esimerkkivastauksen menetelmän kuvauksesta ja kirjoittaa sitten jäsentimen.