Laravel 从 REST API 检索数据

问题描述 投票:0回答:6

好吧,我有以下情况:

我正在构建的系统正在从 REST API 检索数据并将该数据保存到数据库中。 我想知道的是如何实现这一点,以及从 Laravel 结构(控制器、模型等)的角度来看,这样的行为会去哪里? Laravel 是否有内置机制从外部源检索数据?

php api rest laravel laravel-4
6个回答
44
投票

编辑: Buzz已经一年多没有更新了,建议现在使用Guzzle,参见Mohammed Safeer的回答。


我使用了 Buzz 包来发出 API 请求。

您可以通过将其添加到

require
文件中的
composer.json
部分来添加此包。

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

然后运行

composer update
进行安装。

然后在 Laravel 中,您可以将其包装在一个类(可能是类似存储库的类)中,该类处理 API 请求并返回数据以供您的应用程序使用。

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

}

注意:这是伪代码。您需要创建一个适合您需求的类,并执行您想要/需要的任何花哨的依赖项注入或代码架构。

正如@Netbulae 指出的,存储库可能会帮助您。他链接的文章是一个很好的起点。本文与您的代码将执行的操作之间的唯一区别在于,您不是使用 Eloquent 模型从数据库获取数据,而是发出 API 请求并将结果转换为应用程序可以使用的一组数组/对象使用(本质上,只是数据存储不同,这是首先使用存储库类的好处之一)。


34
投票

我们可以在 Laravel 中使用包 Guzzle,它是一个 PHP HTTP 客户端来发送 HTTP 请求。

您可以通过composer安装Guzzle

composer require guzzlehttp/guzzle:~6.0

或者您可以在项目现有的composer.json中指定Guzzle作为依赖项

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

laravel 5 中使用 Guzzle 的示例代码如下所示,

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

}

9
投票

首先你必须在你的

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

注意:如果API调用不需要认证,可以去掉

'before' => 'auth.basic'

在这里您可以从您的

index, store, show, update and destroy
访问
PagesController
方法。

请求网址将是,

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

命令行 CURL 请求将像这样(这里的用户名和密码是

admin
)并假设您有
.htaccess
文件从 url 中删除
index.php

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

接下来,您的

PagesController.php
文件夹中有两个名为
UsersController.php
app/controllers
的控制器。

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

}

然后您就有名为

Page
的模型,它将使用名为
pages
的表。

<?php

class Page extends Eloquent {
}

您可以使用 Laravel4 Generators 使用

php artisan generator
命令创建这些资源。请阅读此处

因此,使用此路由分组,您可以使用相同的应用程序来发出 API 请求并作为前端。


9
投票

您可以选择使用什么:

  1. 狂饮
  2. 卷曲
  3. 文件获取内容:

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

推荐人


2
投票

尝试查看外部 API 的手册。 在那里您将找到有关如何检索信息的信息。

那么最好的计划就是构建一个接口。 看看这个: http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories/

这取决于你如何使用 php 来解决这个问题。


0
投票

虽然这个问题被标记为 Laravel 4,但它仍然显示在网络搜索的顶部。因此发布适用于较新 Laravel 版本的更新解决方案。

Laravel 现在包装了 Guzzle HTTP 客户端,为您提供内置的、更简单的 API 来创建请求:

use Illuminate\Support\Facades\Http;
 
$response = Http::get('http://example.com');

这在 Laravel 7 及以上版本上可用,但在 Laravel 11 之前,您需要手动安装 Guzzle:

composer require guzzlehttp/guzzle

文档 - https://laravel.com/docs/11.x/http-client

© www.soinside.com 2019 - 2024. All rights reserved.