Maak een aangepaste API in OpenCart

U moet op een bepaald moment aangepaste API's maken voor unieke vereisten voor uw projectontwikkeling, en dat is wat we in de loop van deze zelfstudie zullen bespreken. In onze aangepaste API-module halen we de lijst met alle producten op die beschikbaar zijn in de winkel, en het zal een JSON-gecodeerde uitvoer zijn zoals vereist door de REST-normen in OpenCart.

Ik ga ervan uit dat je bekend bent met het basismoduulontwikkelingsproces in OpenCart. Hier is een leuk artikel met een uitgebreid inzicht in het onderwerp voor het geval u het zou willen overslaan. Nog een belangrijk punt: ik gebruik de nieuwste versie van OpenCart, dat wil zeggen 2.1.0.2, en dit zou je ook moeten doen om de compatibiliteit van kern-API's te verzekeren.

Zonder veel van je tijd te verspillen, duik ik meteen in de praktische dingen, en dat is waar het volgende deel over gaat.

Een blik op de bestandsinstellingen

Laten we eens kijken naar de lijst met bestanden die nodig zijn voor de gewenste opstelling.

  • catalogus / controller / api / custom.php: Het is een controllerbestand en de meeste van onze toepassingslogica bevindt zich in dit bestand.
  • catalogus / language / nl-nl / api / custom.php: Het is een taalbestand met taalvariabelen.
  • common.php: Dit bestand bevat de gemeenschappelijke code voor herbruikbaarheidsdoeleinden.
  • login.php: Het is een bestand dat laat zien hoe u zich bij de winkel aanmeldt met behulp van de REST API.
  • products.php: Het is een bestand dat laat zien hoe je producten kunt ophalen met onze aangepaste API-module.

Dus dat is alles wat nodig is om onze aangepaste API-module in te stellen en deze te testen met de PHP CURL-bibliotheek.

We beginnen met het controllerbestand, ga je gang en maak een bestand aan catalogus / controller / api / custom.php met de volgende inhoud.

load> taal ( 'api / custom'); $ json = array (); if (! isset ($ this-> session-> data ['api_id'])) $ json ['error'] ['warning'] = $ this-> language-> get ('error_permission');  else // laadmodel $ this-> load-> model ('catalogus / product'); // krijg producten $ products = $ this-> model_catalog_product-> getProducts (); $ json ['succes'] ['producten'] = $ producten;  if (isset ($ this-> request-> server ['HTTP_ORIGIN'])) $ this-> response-> addHeader ('Access-Control-Allow-Origin:'. $ this-> request-> server [ 'HTTP_ORIGIN']); $ this-> response-> addHeader ('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS'); $ this-> response-> addHeader ('Access-Control-Max-Age: 1000'); $ this-> response-> addHeader ('Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With');  $ this-> response-> addHeader ('Content-type: application / json'); $ This-> response-> Inschakeling (json_encode ($ json)); 

Waarschijnlijk zullen het vrij bekende dingen zijn als je je bewust bent van de structuur van OpenCart-modulebestanden. We bespreken de belangrijke fragmenten van de producten methode.

Allereerst moeten we de echtheid van het verzoek controleren en dit wordt gecontroleerd door het bestaan ​​van het api_id variabele in de actieve sessie. In het geval van een geldig en geverifieerd verzoek, gaan we door en halen alle producten op met behulp van de getProducts methode van de kern Artikel model. Natuurlijk zal het een ongeldig gemaakt foutmelding geven in het geval van ongeldige login.

Vervolgens is er een generieke beveiligingscontrole om te beschermen tegen CSRF-aanvallen. Het wordt bereikt door het bestaan ​​van de te controleren HTTP_ORIGIN variabele en het toevoegen van geschikte headers als deze bestaat.

Ten slotte hebben we de json_encode functie om het te coderen $ producten array, en het resultaat wordt doorgegeven als een argument van de Inschakeling methode.

Vervolgens gaan we door met het maken van een taalbestand voor onze module op catalogus / language / nl-nl / api / custom.php met de volgende inhoud.

Dus dat is het voor zover het de OpenCart-gerelateerde bestandsinstellingen betreft. Vanaf het volgende gedeelte maken we de bestanden waarmee we onze aangepaste API kunnen testen met behulp van de PHP CURL-bibliotheek.

Hoe het werkt

Voordat we doorgaan en onze aangepaste API-module testen, moet u ervoor zorgen dat u API-gebruikersreferenties hebt gemaakt vanaf de achterkant van OpenCart.

Als je dat nog niet hebt gedaan, is het vrij eenvoudig. Ga naar het back-end, navigeer naar Systeem> Gebruikers> API, en voeg een nieuwe API-gebruiker toe. Daarbij is het belangrijk op te merken dat u ook een IP-adres moet toevoegen waarvan u verondersteld wordt om API-aanroepen te doen.

Ga je gang en maak een common.php bestand en plak de volgende inhoud in dat bestand.

$ waarde) $ params_string. = $ sleutel. '='. $ waarde. '&';  rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string);  // voer post $ result = curl_exec ($ ch) uit; // close-verbinding curl_close ($ ch); return $ resultaat; 

Zoals u kunt zien, bevat deze slechts één functie, do_curl_request, die een CURL-oproep doet naar de URL die wordt doorgegeven door de $ url argument. Het tweede argument is een reeks parameters voor het geval u de gegevens POSTt.

De andere belangrijke dingen om op te merken zijn de CURLOPT_COOKIEJAR en  CURLOPT_COOKIEFILE instellingen. Hiermee wordt het bestand ingesteld waarin de cookies worden opgeslagen en gelezen. Aangezien we geverifieerde oproepen moeten maken, is dit een must! Natuurlijk wilt u het pad wijzigen /tmp/apicookie.txt volgens uw systeeminstellingen. Zorg ervoor dat het ook door de webserver kan worden beschreven!

Ten slotte retourneert de functie de reactie door de CURL-aanvraag!

Uiteraard is het eerste wat u moet doen de sessie starten en moet u de aanmeldmethode gebruiken. Laten we een voorbeeld bekijken. Ga je gang en maak een login.php bestand met de volgende inhoud.

 'Demouser', 'key' => 'ysvF7M1nqNYiZV3GFtU252jhn0FrCWMdH8Kw8qR6DApZ7RSJWCN7S0IvIxnti1QP2wUNsYCaG6vHa2l2q8FTFbWNwNYQUO58CfSYJHHJRG0vt7OBN60BnE5MdEVLBSSJVBZJ7ioFuiAmQN1dmBO56dmaawULlY8lnWFXQimecZznUo7NCJHp3rkL1tOAYgeIUl1oVjzrZ7cayikQEvUtwIGj7Ai4XudDH70E7hKGNJcXPiY5RfgFI8PQ8eLg1FZJ',); $ json = do_curl_request ($ url, $ velden); var_dump ($ json);

Ten eerste hebben we de common.php bestand gemaakt in het vorige gedeelte. Vervolgens de $ url variabele definieert de API-inlog-URL van de OpenCart-winkel. Vervolgens de $ velden array bevat de API-gebruikersreferenties die eerder zijn gemaakt. 

Ten slotte noemen we het do_curl_request methode om in te loggen. Belangrijk is dat u een blijk variabele in de $ json voorwerp. Noteer de waarde van die variabele, want we zullen deze moeten doorgeven tijdens volgende API-aanroepen.

Laten we vervolgens een maken products.php bestand met de volgende inhoud.

Het belangrijkste fragment dat in het bovenstaande voorbeeld moet worden vermeld, is de route-querystringvariabele. Het is ingesteld op de api / custom / products waarde, die volgens afspraak de producten methode gedefinieerd in de custom.php controllerbestand gemaakt aan het begin van deze tutorial. Ook hebben we de blijk variabele en de waarde ervan om ervoor te zorgen dat we toegang hebben tot de API.

Hoe dan ook, we zijn geïnteresseerd in de juiste JSON-gecodeerde uitvoer in de $ data variabel. En dat is wat u zou moeten zien als u het products.php het dossier! Het zou uit de doos moeten werken als u de juiste gebruikersreferenties hebt gemaakt en de bestanden hebt ingesteld zoals uitgelegd.

Dit is slechts het oppervlak aan het krassen van wat de REST-API in OpenCart kan. In ons geval was het een vrij eenvoudig maar effectief voorbeeld om het onderwerp te demonstreren. Dat gezegd hebbende, kunt u het uitbreiden en maatwerkoplossingen implementeren volgens uw vereisten.

Dat is het voor het artikel van vandaag. Aarzel niet om vragen te stellen en uw suggesties te laten zoals ze waardevol zijn!

Conclusie

Vandaag hebben we besproken hoe u een aangepaste API in OpenCart kunt maken door een aangepaste module te maken. Tijdens dit proces hebben we de volledige workflow doorlopen om de bovengenoemde functionaliteit te bereiken.

Je kunt me bereiken via de onderstaande feedsectie, en ik breng ook wat tijd op Twitter door als je daar liever contact met me opneemt!