好的,我有以下情况:
我正在构建的系统从REST API中检索数据并将该数据保存到数据库中。 我想知道如何实现这个功能,并且在Laravel结构(控制器、模型等)的哪里才能处理这种行为? Laravel是否具有从外部源检索数据的内置机制?
编辑:Buzz 已经超过一年没有更新了,现在建议使用 Guzzle,请参考 Mohammed Safeer's 的回答。
composer.json
文件的require
部分中来添加此包。{
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
}
}
curl
从Laravel应用程序检索数据。还有一个注意事项 - 不要盲目运行composer update
- 它会更新所有库,可能会破坏某些内容。如果您想保持稳定,请始终使用composer require vendor/library
方法。 - JustAMartin我们可以在Laravel中使用Guzzle包,它是一个PHP HTTP客户端,用于发送HTTP请求。
您可以通过composer安装Guzzle。
composer require guzzlehttp/guzzle:~6.0
或者,您可以在项目的现有composer.json中将Guzzle指定为依赖项
{
"require": {
"guzzlehttp/guzzle": "~6.0"
}
}
以下是使用Guzzle在Laravel 5中的示例代码:
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);
}
您可以选择使用什么:
file_get_contents :
$json = json_decode(file_get_contents('http://host.com/api/v1/users/1'), true);
首先您需要在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'
在这里,您可以从您的PagesController
访问index, store, show, update和destroy
方法。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
app/controllers
文件夹中有两个控制器,它们的名称分别为PagesController.php
和UsersController.php
。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 {
}
php artisan generator
命令创建这些资源。在此处阅读:这里。foreach ($input as $key => $value) { $page->$key = $value; }
可能有效。 - Anshad Vattapoyil