web-dev-qa-db-fra.com

Laravel récupération des données de REST API

D'accord, j'ai donc une situation suivante:

Le système que je construis récupère des données à partir d'une API REST et enregistre ces données dans une base de données. (contrôleur, modèle, etc.)? Laravel possède-t-il un mécanisme intégré pour récupérer des données à partir de sources externes?

27
Tomkarho

Vous devez d'abord créer des itinéraires dans votre app/routes.php

/*
    API Routes
*/

Route::group(array('prefix' => 'api/v1', 'before' => 'auth.basic'), function()
{
    Route::resource('pages', 'PagesController', array('only' => array('index', 'store', 'show', 'update', 'destroy')));
    Route::resource('users', 'UsersController');
});

Remarque: Si aucune authentification n'est requise pour l'appel d'API, vous pouvez supprimer 'before' => 'auth.basic'

Ici, vous pouvez accéder à index, store, show, update and destroy méthodes de votre PagesController.

Et les URL de demande seront,

GET http://localhost/project/api/v1/pages // this will call index function
POST http://localhost/project/api/v1/pages // this will call store function
GET http://localhost/project/api/v1/pages/1 // this will call show method with 1 as arg
PUT http://localhost/project/api/v1/pages/1 // this will call update with 1 as arg
DELETE http://localhost/project/api/v1/pages/1 // this will call destroy with 1 as arg

La requête CURL en ligne de commande sera comme ceci (ici le nom d'utilisateur et le mot de passe sont admin) et suppose que vous avez .htaccess fichier à supprimer index.php de l'url,

curl --user admin:admin localhost/project/api/v1/pages    
curl --user admin:admin -d 'title=sample&slug=abc' localhost/project/api/v1/pages
curl --user admin:admin localhost/project/api/v1/pages/2
curl -i -X PUT --user admin:admin -d 'title=Updated Title' localhost/project/api/v1/pages/2
curl -i -X DELETE --user admin:admin localhost/project/api/v1/pages/1

Ensuite, vous avez deux contrôleurs nommés PagesController.php et UsersController.php dans votre app/controllers dossier.

Le PagesController.php,

<?php


class PagesController extends BaseController {


    /**
     * Display a listing of the resource.
     *
     * @return Response
     * curl --user admin:admin localhost/project/api/v1/pages
     */

    public function index() {

        $pages = Page::all();;

        return Response::json(array(
            'status' => 'success',
            'pages' => $pages->toArray()),
            200
        );
    }


    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     * curl --user admin:admin -d 'title=sample&slug=abc' localhost/project/api/v1/pages
     */

    public function store() {

        // add some validation also
        $input = Input::all();

        $page = new Page;

        if ( $input['title'] ) {
            $page->title =$input['title'];
        }
        if ( $input['slug'] ) {
            $page->slug =$input['slug'];
        }

        $page->save();

        return Response::json(array(
            'error' => false,
            'pages' => $page->toArray()),
            200
        );
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     * curl --user admin:admin localhost/project/api/v1/pages/2
     */

    public function show($id) {

        $page = Page::where('id', $id)
                    ->take(1)
                    ->get();

        return Response::json(array(
            'status' => 'success',
            'pages' => $page->toArray()),
            200
        );
    }


    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     * curl -i -X PUT --user admin:admin -d 'title=Updated Title' localhost/project/api/v1/pages/2
     */

    public function update($id) {

        $input = Input::all();

        $page = Page::find($id);

        if ( $input['title'] ) {
            $page->title =$input['title'];
        }
        if ( $input['slug'] ) {
            $page->slug =$input['slug'];
        }

        $page->save();

        return Response::json(array(
            'error' => false,
            'message' => 'Page Updated'),
            200
        );
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     * curl -i -X DELETE --user admin:admin localhost/project/api/v1/pages/1
     */

    public function destroy($id) {
        $page = Page::find($id);

        $page->delete();

        return Response::json(array(
            'error' => false,
            'message' => 'Page Deleted'),
            200
        );
    }

}

Ensuite, vous avez un modèle nommé Page qui utilisera la table nommée pages.

<?php

class Page extends Eloquent {
}

Vous pouvez utiliser les générateurs Laravel4 pour créer ces ressources à l'aide de php artisan generator commande. Lisez ici .

Donc, en utilisant ce regroupement de routes, vous pouvez utiliser la même application pour faire une demande d'API et en tant que frontal.

9
devo

Edit: Buzz n'a pas été mis à jour depuis plus d'un an, il est recommandé d'utiliser maintenant Guzzle =, voir Mohammed Safeer réponse.


J'ai utilisé package Buzz afin de faire des requêtes API.

Vous pouvez ajouter ce package en l'ajoutant à la section require de votre composer.json fichier.

{
    require: {
        "kriswallsmith/buzz": "dev-master"
    }
}

Exécutez ensuite composer update pour l'installer.

Ensuite, dans Laravel vous pouvez l'encapsuler dans une classe (peut-être une classe de type référentiel) qui gère la demande d'API et le retour des données à utiliser par votre application.

<?php namespace My\App\Service;

class SomeApi {

    public function __construct($buzz)
    {
        $this->client = $buzz;
    }

    public function getAllWidgets()
    {
        $data = $this->client->get('http://api.example.com/all.json');
        // Do things with data, etc etc
    }

}

Remarque: il s'agit d'un pseudocode. Vous aurez besoin de créer une classe qui fonctionne pour vos besoins, et de faire toute injection de dépendance ou architecture de code que vous voulez/besoin.

Comme l'a souligné @Netbulae, un référentiel peut vous aider. Le article qu'il a lié est un excellent point de départ. La seule différence entre l'article et ce que fera votre code est qu'au lieu d'utiliser un modèle Eloquent pour obtenir vos données de votre base de données, vous effectuez une demande d'API et transformez le résultat en un ensemble de tableaux/objets que votre application peut utilisation (Essentiellement, seul le stockage des données est différent, ce qui est l'un des avantages de se soucier d'une classe de référentiel en premier lieu).

42
fideloper

Nous pouvons utiliser le paquet Guzzle dans Laravel, c'est un client HTTP PHP pour envoyer des requêtes HTTP.

Vous pouvez installer Guzzle via le compositeur

composer require guzzlehttp/guzzle:~6.0

Ou vous pouvez spécifier Guzzle comme une dépendance dans le fichier composer.json existant de votre projet

{
   "require": {
      "guzzlehttp/guzzle": "~6.0"
   }
}

Exemple de code dans laravel 5 utilisant Guzzle comme indiqué ci-dessous,

use GuzzleHttp\Client;
class yourController extends Controller {

    public function saveApiData()
    {
        $client = new Client();
        $res = $client->request('POST', 'https://url_to_the_api', [
            'form_params' => [
                'client_id' => 'test_id',
                'secret' => 'test_secret',
            ]
        ]);

        $result= $res->getBody();
        dd($result);

}
24
Mohammed Safeer

Vous pouvez choisir quoi utiliser:

  1. Bouffer
  2. CURL
  3. file_get_contents:

    $json = json_decode(file_get_contents('http://Host.com/api/v1/users/1'), true);
    

Référent

6
tsveti_iko

Essayez de consulter les manuels de l'API externe. Vous y trouverez des informations sur la façon de récupérer des informations.

Ensuite, le meilleur plan est de construire une interface. Vérifiez ceci: http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/

C'est à vous de voir comment vous utilisez php pour résoudre ce problème.

2
Skid Kadda