Werken met RESTful Services in CodeIgniter

CodeIgniter wordt bekend om zijn kracht als een op PHP gebaseerd webapplicatieframework, maar het gebeurt niet vaak dat we voorbeelden zien die voor iets anders worden gebruikt. Vandaag leren we hoe we CodeIgniter kunnen gebruiken om een ​​RESTful API voor uw bestaande webtoepassingen te maken en laten we zien hoe u kunt communiceren met uw eigen API of andere RESTful webservices, zoals Facebook en Twitter.

Zoals u wellicht weet, vindt u een ruime keuze aan CodeIgniter-scripts en -apps op Envato Market, van lidmaatschapsscripts tot menubeheerders en nog veel meer.

Zelfstudiedetails

  • Programma: CodeIgniter, CodeIgniter REST-server en CodeIgniter REST-client
  • Moeilijkheidsgraad: Medium
  • Geschatte voltooiingstijd: 30 minuten

Invoering

Als u de CodeIgniter Van Scratch series zult u inmiddels weten dat het relatief snel en gemakkelijk is om eenvoudige webtoepassingen samen te stellen, zoals blogs, CMS-systemen, brochuresites, etc. Een ding waar u misschien niet aan hebt gedacht, is het gebruik van CodeIgniter om een ​​interactieve API te maken. Na verschillende bestaande REST-implementaties geprobeerd te hebben, merkte ik dat ze niet alleen de eenvoud ontbraken, maar ook de meeste functies misten die je van een RESTful implementatie zou verwachten; dus ik heb mijn eigen gebouwd. Deze tutorial zal je laten zien hoe je deze code kunt gebruiken om je REST API in te stellen, en geeft een voorbeeld van hoe je ermee kunt communiceren vanuit je webapplicatie.

Veronderstellingen

  1. U hebt een webserver opgezet, lokaal of online en weet hoe u bestanden erop kunt beheren.
  2. U hebt een paar van de CodeIgniter gelezen in Scratch-zelfstudies.
  3. Je weet hoe je CodeIgniter moet instellen.
  4. Je weet een beetje over RESTful services.

Deze tutorial bestaat uit twee delen. We zullen beginnen met te leren hoe een RESTful-service te maken, en dan verder naar beneden, zullen we leren hoe we er op een paar verschillende manieren mee kunnen omgaan..

Deel 1 - Een RESTful API maken

Stap 1: De demo instellen

Eerst moet je de codeigniter-restserver code downloaden van GitHub en uitpakken en de code naar je server verplaatsen.

Wanneer u de map opent, ziet u een volledige installatie van CodeIgniter, die er is om de demo van stroom te voorzien. Hierdoor kunnen mensen een spel spelen met de REST-demo voordat ze worden geïntegreerd met uw bestaande applicatie.

Doe open "Application / config / config.php" en stel de base_url in om koppelingen te laten werken. Deze base_url zal voor iedereen anders zijn en hangt volledig af van waar je je bestanden hebt geüpload.

Stap 2: De URL's

Nadat de bestanden zijn uitgepakt en de base_url is ingesteld, zijn we klaar om onze RESTful CodeIgniter-installatie op te laden en de demo te bekijken die ermee is meegeleverd. Blader door de basis-URL, die standaard is:

http: // localhost / restserver

Hier vindt u enkele voorbeeldlinks naar de example_api controller, die te vinden is op "Application / controllers / example_api.php". Laten we de URL's van deze voorbeelden ontleden om te zien wat er aan de hand is. De eerste URL is heel eenvoudig.

Deze URL lijkt erg veel op elke andere CodeIgniter-URL met een controller en een methode, maar u zult in dit diagram zien dat de methode een "Resource" wordt genoemd. REST gaat helemaal over Bronnen en ze zijn in essentie een zelfstandig naamwoord binnen uw applicatie, die interactief zijn met (d.w.z. toegevoegd, verwijderd, bewerkt, bevraagd) op basis van HTTP-headers en URL-querystrings of HTTP-argumenten.

Het standaardformaat voor uitvoer is XML, wat we in dit basisvoorbeeld zien. De andere koppelingen zijn iets groter en laten zien hoe parameters moeten worden doorgegeven en hoe het uitvoerformaat in de URL kan worden gewijzigd:

Normaal gesproken geeft u in CodeIgniter parameterwaarden door, maar een REST-controller accepteert een willekeurig aantal parameters in elke willekeurige volgorde. Om dit te laten werken, moeten we de naam van de parameter doorgeven, gevolgd door de waarde in paren.

Aan het einde van de URL staat de parameter "format". Dit is een gereserveerde parameter die het uitvoerformaat van de gevraagde gegevens als volgt zal wijzigen:

Door zowel de API-ontwikkelaar als de clienttoepassing de keuze te geven van gegevensindelingen, wordt de API geopend voor een veel breder publiek en kan deze worden gebruikt met meer programmeertalen en -systemen. Deze drie zijn niet de enige ondersteunde indelingen, uit de verpakking die uw REST-API kan gebruiken:

  • xml - bijna elke programmeertaal kan XML lezen
  • json - handig voor JavaScript en in toenemende mate PHP-apps.
  • csv - open met spreadsheetprogramma's
  • html - een eenvoudige HTML-tabel
  • php - Vertegenwoordiging van PHP-code die eval () 'ed kan zijn
  • serialize - Geserialiseerde gegevens die niet kunnen worden geserialiseerd in PHP

Hoewel het toevoegen van het formaat aan de URL technisch gezien niet de meest RESTVORMIGE manier is om de indelingen te wijzigen, kunt u eenvoudig browsertests uitvoeren en kunnen ontwikkelaars zonder cURL eenvoudige GET-aanvragen uitvoeren op de API. De meer RESTIEVE manier is om een ​​te verzenden Content-type HTTP-header naar de REST-controller met behulp van cURL, maar dat wordt later uitgelegd.

Stap 3: De code

Nu, als u zich openstelt application / controllers / example_api.php u zult onmiddellijk een paar verschillen ontdekken van normale CodeIgniter-controllers.

REST_Controller

In het MVC-patroon is een controller het centrale punt van de logica. Het wordt opgeroepen wanneer een gebruiker een aanvraag doet en vervolgens op basis van de logica in de controller gegevens en outputs opvraagt. CodeIgniter bevat zijn eigen logica voor hoe een controller zou moeten werken, maar omdat we iets anders doen, hebben we onze eigen REST_Controller-bibliotheek nodig om zijn eigen REST-gerelateerde logica te bevatten. Dus in plaats van gewoon te gebruiken:

 

... je moet gebruiken:

 

Werken met bronnen

Nu is je lege controller ingesteld, daarna zijn de methoden of "bronnen". Dit is waarschijnlijk het meest verwarrende deel van de tutorial als je gewend bent hoe CodeIgniter werkt. Kortom, u neemt het Resource- en het HTTP-werkwoord en combineert ze om een ​​methode-naam te maken. Dus de twee voorbeelden waar we eerder naar gekeken hadden een Bron van gebruiker en gebruikers. Omdat beide in de browser zijn geladen, weten we dat het een GET-aanvraag gebruikte en daarom worden de twee onderstaande methoden gebruikt:

 

Dit lijkt misschien een beetje vreemd, maar het geeft je de mogelijkheid om dezelfde URL te gebruiken en te reageren op het verzoek, afhankelijk van het HTTP-werkwoord dat is gebruikt. Als iemand probeert toegang te krijgen tot uw API op een manier die niet is toegestaan ​​(in dit voorbeeld PUT of DELETE), antwoordt deze eenvoudigweg met een 404. Als u niet zeker bent over HTTP-werkwoorden, kunt u mij dit uitleggen.

KRIJGEN

Wordt gebruikt om informatie over een bestaande bron op te halen. Dit wordt gebruikt door browsers wanneer u een URL invoert en op go klikt, of wanneer u op een link klikt, zodat het perfect is om informatie op te halen over een van uw REST-bronnen (zoals de gebruiker).

POST

Gebruikt om een ​​bestaande bron met informatie bij te werken. Browsers gebruiken dit om de meeste soorten formulieren op internet in te dienen, hoewel sommigen ook GET gebruiken door de formulieractie in te dienen met een querystring met de veldgegevens.

LEGGEN

Minder vaak gebruikt en niet ondersteund door de meeste browsers, PUT wordt gebruikt om een ​​nieuwe bron te maken.

DELETE

Dit HTTP-werkwoord wordt ook niet door veel browsers gebruikt en wordt duidelijk gebruikt om een ​​bron te verwijderen.

Als we dat in code plaatsen en elk werkwoord op de bron toestaan gebruiker het zou er zo uit zien:

 

Toegang krijgen tot parameters en terugkerende gegevens

Dus nu heeft de API zijn structuur gekregen door de middelen in te stellen en een methode te definiëren voor elk HTTP-werkwoord dat we willen ondersteunen; we hebben parameters nodig zodat we onze CodeIgniter-modellen en -bibliotheken kunnen gebruiken. Dit is een van de belangrijkste voordelen van het gebruik van CodeIgniter voor onze API, omdat we onze bestaande modellen en bibliotheken kunnen gebruiken en ze niet opnieuw hoeven te coderen.

te krijgen ( 'id')); $ This-> respons ($ data);  function user_post () $ data = array ('returns:'. $ this-> post ('id')); $ This-> respons ($ data);  function user_put () $ data = array ('returns:'. $ this-> put ('id')); $ this-> response ($ data;) function user_delete () $ data = array ('returns:'. $ this-> delete ('id')); $ this-> response ($ data);

Dit voorbeeld bevat vijf nieuwe stukjes code:

$ This-> get ()

Wordt gebruikt om GET-variabelen te retourneren van een queryreeks zoals deze index.php / example_api / user? Id = 1 of kan worden ingesteld op de meer CodeIgniter'-achtige manier met index.php / example_api / user / id / 1.

$ This-> post ()

Is een alias voor $ this-> input-> post (), de codeIgniter-methode om toegang te krijgen tot $ _POST-variabelen met XSS-beveiliging.

$ This-> put ()

Leest in PUT-argumenten die zijn ingesteld in de HTTP-headers of via cURL.

$ This-> delete ()

U raadt het al, dit leest in DELETE-argumenten, ook ingesteld in HTTP-headers of via cURL.

$ This-> respons ()

Verzendt gegevens naar de browser in elke gewenste gegevensindeling, of standaard naar XML. U kunt optioneel een HTTP-statuscode doorgeven om aan te geven dat deze werkt of is mislukt. Als de verstrekte ID bijvoorbeeld niet in de database stond, zou u $ this-> response (array ('error' => 'User not found.'), 404) kunnen gebruiken;

Stap 4: Werken met uw modellen

Tot nu toe hebben we gewerkt met een voorbeeld-API in een schone installatie. Dus de volgende stap is om een ​​REST-API te laten draaien vanaf uw bestaande codebase.

Hoewel de download wordt geleverd met een volledige CodeIgniter-installatie voor de demo en om toe te staan ​​dat API's vanaf nul worden opgebouwd, zijn de enige twee belangrijke bestanden:

  1. application / config / rest.php
  2. application / libraries / REST_Controller.php

Zet die twee bestanden neer in uw toepassing CodeIgniter en maak een nieuwe API-controller.

get ('id')) $ this-> response (NULL, 400);  $ user = $ this-> user_model-> get ($ this-> get ('id')); if ($ user) $ this-> response ($ user, 200); // 200 is de HTTP-antwoordcode else $ this-> reactie (NULL, 404);  function user_post () $ result = $ this-> user_model-> update ($ this-> post ('id'), array ('name' => $ this-> post ('name'), 'email '=> $ this-> post (' email '))); if ($ result === FALSE) $ this-> response (array ('status' => 'failed'));  else $ this-> response (array ('status' => 'succes'));  function users_get () $ users = $ this-> user_model-> get_all (); if ($ users) $ this-> response ($ users, 200);  else $ this-> response (NULL, 404); ?>

Dit toont een voorbeeld-API met enkele generieke modelnamen. In de eerste methode nemen we een? Id = XX op en geven deze door aan het model. Als er gegevens worden gevonden, sturen we deze naar de functie $ this-> response () met de status 200. Als er niets wordt gevonden, retourneert u geen body en een 404 om te zeggen dat er niets is gevonden. U kunt zich voorstellen hoe dit kan worden uitgebreid om alle soorten API-activiteiten voor uw webtoepassing uit te voeren.

Stap 5: De API beveiligen

Nu is uw API gebouwd die hij moet beveiligen, zodat alleen gebruikers die toegang krijgen, kunnen communiceren met de API. Om het login-type in te stellen, openen gebruikersnamen en wachtwoorden "Application / config / rest.php" in je codebase.

/ * | ----------------------------------------------- --------------------------- | REST Inloggen | ----------------------------------------------- --------------------------- | | Is inloggen vereist en zo ja, welk type login? | | "= geen login vereist, 'basic' = relatief veilige login, 'digest' = beveiligde login | * / $ config ['rest_auth'] = 'basic';

Geen

Iedereen kan communiceren met een van uw API-controllers.

basis-

Een relatief onveilige inlogmethode die alleen op interne / beveiligde netwerken mag worden gebruikt.

Verteren

Een veel veiligere inlogmethode die gebruikersnamen en wachtwoorden versleutelt. Als u een beveiligde API wilt hebben waar iedereen toegang toe kan krijgen, gebruik dan de digest.

/ * | ----------------------------------------------- --------------------------- | REST Inloggen gebruikersnamen | ---------------------------------------------- ---------------------------- | | Serie van gebruikersnamen en wachtwoorden voor inloggen | | array ('admin' => '1234') | * / $ config ['rest_valid_logins'] = array ('admin' => '1234');

Het instellen van de gebruikers is eenvoudig. Elke aanmelding is een array-item, met een sleutel en een waarde. De sleutel is de gebruikersnaam en de waarde is het wachtwoord. Voeg zoveel als je wilt aan deze array toe en deel ze uit aan iedereen die de API gaat gebruiken.

Deel 2 - Interactie met RESTful Services

Of het nu gaat om de API die u zojuist hebt gebouwd of een openbare service zoals Twitter, u wilt op een of andere manier ermee kunnen communiceren. Aangezien REST-services werken met standaard HTTP-verzoeken, is het heel eenvoudig om dit op verschillende manieren te doen.

Verschillende methoden om met REST om te gaan

Elk van deze verschillende interactiemethoden wordt getoond met de code rechtstreeks in de controller-methoden. Dit is puur zodat de demo's gemakkelijker te lezen zijn en normaal gesproken in een model of bibliotheek worden geplaatst voor een correcte MVC-scheiding.

file_get_contents ()

Met behulp van de zeer eenvoudige PHP-functie file_get_contents (), kunt u een standaard GET-verzoek uitvoeren. Dit is de meest eenvoudige van alle methoden, maar het is het vermelden waard voor die "snelle en vuile" momenten.

$ user = json_decode (file_get_contents ('http://example.com/index.php/api/user/id/1/format/json')); echo $ user-> naam;

Het is vermeldenswaard dat, hoewel deze methode niet werkt met HTTP Digest-verificatie, als u HTTP Basic-verificatie gebruikt, u de volgende syntaxis kunt gebruiken om gegevens van uw wachtwoord te beveiligen RESTful API:

$ user = json_decode (file_get_contents ('http: // admin: [email protected]/index.php/api/user/id/1/format/json')); echo $ user-> naam;

Er zijn een paar problemen met het gebruik van deze methode: de enige manier om extra HTTP-headers in te stellen is om ze handmatig in te stellen met behulp van de PHP-functie stream_context_create (), wat erg ingewikkeld kan zijn voor ontwikkelaars die de interne werking van HTTP-aanvragen nieuw zijn. Een ander nadeel is dat u alleen de body van de HTTP-respons in zijn onbewerkte indeling ontvangt, wat betekent dat u de conversie vanuit een enkel verzoek moet afhandelen.

Krul

cURL is de meest flexibele manier om te communiceren met een REST API, omdat deze is ontworpen voor precies dit soort dingen. U kunt HTTP-headers, HTTP-parameters en nog veel meer instellen. Hier is een voorbeeld van hoe een gebruiker te updaten met onze example_api en cURL om een ​​POST-aanvraag te doen:

 function native_curl ($ nieuwe_naam, $ nieuwe_email) $ gebruikersnaam = 'admin'; $ wachtwoord = '1234'; // Alternatieve JSON-versie // $ url = 'http://twitter.com/statuses/update.json'; // Stel het krulproces in en voer het uit $ curl_handle = curl_init (); curl_setopt ($ curl_handle, CURLOPT_URL, 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); curl_setopt ($ curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ curl_handle, CURLOPT_POST, 1); curl_setopt ($ curl_handle, CURLOPT_POSTFIELDS, array ('name' => $ new_name, 'email' => $ new_email)); // Optioneel, verwijder deze regel als uw API open is curl_setopt ($ curl_handle, CURLOPT_USERPWD, $ gebruikersnaam. ':'. $ Wachtwoord); $ buffer = curl_exec ($ curl_handle); curl_close ($ curl_handle); $ result = json_decode ($ buffer); if (isset ($ result-> status) && $ result-> status == 'success') echo 'Gebruiker is bijgewerkt.';  else echo 'Er is iets fout gegaan'; 

Interactie met uw API werkt op deze manier prima, maar er zijn twee problemen met deze methode:

  1. Het gebruikt een lelijke verwarrende syntaxis - stel je voor dat je op basis hiervan een aantal applicaties maakt.
  2. cURL is standaard niet op alle servers geïnstalleerd.

Om deze lelijke syntaxis op te lossen, is een cURL-bibliotheek ontwikkeld voor CodeIgniter die de zaken enorm vereenvoudigt.

Het exacte verzoek dat wordt gedaan met de cURL-bibliotheek ziet er als volgt uit:

 functie ci_curl ($ nieuwe_naam, $ nieuwe_email) $ gebruikersnaam = 'admin'; $ wachtwoord = '1234'; $ This-> load-> library ( 'krul'); $ This-> curl-> te maken ( 'http: //localhost/restserver/index.php/example_api/user/id/1/format/json'); // Optioneel, verwijder deze regel als uw API is geopend $ this-> curl-> http_login ($ gebruikersnaam, $ wachtwoord); $ this-> curl-> post (array ('name' => $ new_name, 'email' => $ new_email)); $ result = json_decode ($ this-> curl-> execute ()); if (isset ($ result-> status) && $ result-> status == 'success') echo 'Gebruiker is bijgewerkt.';  else echo 'Er is iets fout gegaan'; 

Veel leuker om naar te kijken, toch? Welnu, er is een nog eenvoudiger methode om met REST in je CodeIgniter-applicaties dit te gebruiken.

REST client-bibliotheek

Er is een REST-clientbibliotheek ontwikkeld die bovenop deze cURL-bibliotheek staat, die formaatconversie, HTTP-aanmeldingen en verschillende andere aspecten van uw REST API verwerkt..

 functie rest_client_example ($ id) $ this-> load-> library ('rest', array ('server' => 'http: //localhost/restserver/index.php/example_api/', 'http_user' => ' admin ',' http_pass '=>' 1234 ',' http_auth '=>' basic '// of' digest ')); $ user = $ this-> rest-> get ('user', array ('id' => $ id), 'json'); echo $ user-> naam; 

Hier kun je zien dat we een GET-verzoek doen, id als parameter verzenden en de bibliotheek vertellen dat we 'json' als inhoudsformaat willen. Dit behandelt de instelling van Content-type voor u en converteert de gegevens naar een PHP-object voor u. U kunt deze waarde wijzigen in 'xml', 'json', 'serialize', 'php', 'csv' of elk aangepast MIME-type dat u bevalt, bijvoorbeeld:

 $ user = $ this-> rest-> get ('user', array ('id' => $ id), 'application / json');

Zoals je waarschijnlijk ook hebt geraden als $ this-> rest-> get (), ondersteunt de bibliotheek ook $ this-> rest-> post (), $ this-> rest-> put (), $ this-> rest -> delete () om overeen te komen met al uw REST_Controller-methoden.

U moet de resultaten var_dump () uit de REST-clientbibliotheek gebruiken om ervoor te zorgen dat u de juiste gegevensindeling terugkrijgt. De conversie zal soms een array zijn en soms een object zijn, afhankelijk van hoe het door PHP is geconverteerd. Als het geretourneerde MIME-type niet wordt ondersteund, retourneert het eenvoudig het formaat als platte tekst.

Praten met Twitter

Met deze REST-bibliotheek kunt u praten over andere RESTful-services zoals Twitter en Facebook. Hier is een eenvoudig voorbeeld van hoe u details kunt krijgen voor een specifieke gebruiker op basis van hun ID, met behulp van Twitter's standaardformaat XML.

 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/')); $ user = $ this-> rest-> get ('users / show', array ('screen_name' => 'philsturgeon'));
 $ this-> load-> library ('rest', array ('server' => 'http://twitter.com/', 'http_user' => 'gebruikersnaam', 'http_pass' => 'wachtwoord', ' http_auth '=>' basic ')); $ user = $ this-> rest-> post ('statussen / update.json', array ('status' => 'Gebruik de REST-client om dingen te doen'));

Als je dit bekijkt, zul je merken dat de interactie met de Twitter API op een paar manieren een beetje anders is.

  1. Ze ondersteunen op URL gebaseerde formattering in de vorm van .json in plaats van / format / json. Sommige vereisen een extensie, andere niet; dus het is het beste om ze altijd toe te voegen.
  2. Ze ondersteunen meestal alleen GET / POST, maar beginnen meer DELETE-methoden toe te voegen
  3. Ze hebben niet altijd alleen een bron in hun URL, bijvoorbeeld: gebruikers / search is een REST-methode, maar lijsten is een ander.

Houd deze verschillen in de gaten, want ze kunnen je naar buiten brengen. Als u vastloopt, echo $ this-> rest-> debug () voor een hele reeks informatie over uw REST-aanvraag.

Samenvatting

Door het combineren van wat u nu weet over RESTful-services, de CodeIgniter REST-clientbibliotheek en de Twitter API-documentatie - of een andere RESTful API-documentatie - kunt u een aantal zeer krachtige applicaties maken die met REST kunnen worden geïntegreerd met elke aangepaste of openbare webservice. U kunt uw API uitbreiden door meer REST_Controller's te maken en zelfs een modulaire API maken door Matchbox of Modular Separation te gebruiken om een ​​api.php-controller voor elke module te maken om uw API netjes georganiseerd te houden als uw applicatie.

Volg ons op Twitter of abonneer je op de Nettuts + RSS Feed voor de beste tutorials voor webontwikkeling op internet. En vergeet niet om de nuttige CodeIgniter-scripts en -apps op Envato Market te bekijken.