it-swarm.com.de

Laravel Abrufen von Daten von REST API

Okay, ich habe folgende Situation:

Das System, das ich aufbaue, ruft Daten von einer API REST= ab und speichert diese Daten in einer Datenbank. Ich frage mich, wie dies implementiert werden kann und wie sich dieses Verhalten im Sinne von Laravels verhalten würde Struktur (Controller, Modell usw.)? Verfügt Laravel) über einen eingebauten Mechanismus zum Abrufen von Daten aus externen Quellen?

27
Tomkarho

Zuerst müssen Sie Routen in Ihrem 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');
});

Hinweis: Wenn Sie für den API-Aufruf keine Authentifizierung benötigen, können Sie 'before' => 'auth.basic' Entfernen.

Hier können Sie über Ihr PagesController auf index, store, show, update and destroy - Methoden zugreifen.

Und die Anfrage-URLs werden lauten:

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

Die Befehlszeilen-CURL-Anforderung sieht folgendermaßen aus (hier sind Benutzername und Kennwort admin) und setzt voraus, dass Sie über die Datei .htaccess Verfügen, um index.php Aus der URL zu entfernen.

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

Als nächstes haben Sie zwei Controller mit den Namen PagesController.php Und UsersController.php In Ihrem Ordner app/controllers.

Die 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
        );
    }

}

Dann haben Sie das Modell Page, das die Tabelle pages verwendet.

<?php

class Page extends Eloquent {
}

Sie können Laravel4-Generatoren verwenden, um diese Ressourcen mit dem Befehl php artisan generator Zu erstellen. Lesen Sie hier .

Wenn Sie diese Routengruppierung verwenden, können Sie dieselbe Anwendung für die API-Anforderung und als Front-End verwenden.

9
devo

Bearbeiten: Buzz wurde seit über einem Jahr nicht mehr aktualisiert. Es wird empfohlen, jetzt Guzzle zu verwenden = siehe Mohammed Safeer Antwort.


Ich habe Buzz-Paket verwendet, um API-Anfragen zu stellen.

Sie können dieses Paket hinzufügen, indem Sie es dem Abschnitt require in Ihrer Datei composer.json Hinzufügen.

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

Führen Sie dann composer update Aus, um es zu installieren.

Dann können Sie es in Laravel) in eine Klasse (möglicherweise eine Repository-ähnliche Klasse) einbinden, die die API-Anforderung und die Rückgabe von Daten für Ihre App übernimmt.

<?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
    }

}

Hinweis: Dies ist ein Pseudocode. Sie müssen eine Klasse erstellen, die Ihren Anforderungen entspricht, und jede gewünschte Abhängigkeitsinjektion oder Codearchitektur ausführen.

Wie @Netbulae hervorhob, könnte Ihnen ein Repository helfen. Der von ihm verlinkter Artikel ist ein großartiger Ort, um anzufangen. Der einzige Unterschied zwischen dem Artikel und dem Code besteht darin, dass Sie, anstatt ein Eloquent-Modell zum Abrufen Ihrer Daten aus Ihrer Datenbank zu verwenden, eine API-Anfrage stellen und das Ergebnis in eine Reihe von Arrays/Objekten umwandeln, die Ihre Anwendung verwenden kann Verwendung (Im Wesentlichen unterscheidet sich nur die Datenspeicherung, was einer der Vorteile ist, wenn man sich in erster Linie mit einer Repository-Klasse befasst).

42
fideloper

Wir können package Guzzle in Laravel verwenden, es ist ein PHP HTTP-Client zum Senden von HTTP-Anfragen.

Sie können Guzzle über Composer installieren

composer require guzzlehttp/guzzle:~6.0

Oder Sie können Guzzle als Abhängigkeit in der vorhandenen Datei composer.json Ihres Projekts angeben

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

Beispielcode in laravel 5 mit Guzzle wie unten gezeigt,

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

Sie können wählen, was Sie verwenden möchten:

  1. Fressen
  2. CURL
  3. file_get_contents:

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

Referrer

6
tsveti_iko

Schauen Sie sich die Handbücher der externen API an. Dort finden Sie Informationen zum Abrufen von Informationen.

Dann ist der beste Plan, ein Interface zu bauen. Überprüfen Sie dies: http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/

Es liegt an Ihnen, wie Sie PHP verwenden, um dies zu lösen.

2
Skid Kadda