消费我自己Laravel API(Consuming my own Laravel API)

2019-09-02 20:54发布

我正在开发一个Laravel 4的应用程序,这将使通过一个JSON REST API以及Web UI,可我的数据集相同的CRUD操作。 看来,以防止破坏DRY原则,我的用户界面应该由路由从UI的所有请求回API消费我自己的API。 我不能确定,虽然即将使这项工作的最佳方法。 大概我会独立的用户界面和API控制器并以某种方式将请求路由通过。 或者我应该寻找一个不同的方法完全?

谢谢。

Answer 1:

实际上,我有同样的想法,修修补补,它是非常整洁。 随着Laravel你必须使内部请求的能力(有些人可能将此称为HMVC,但我不会)。 下面是一个内部请求的基础。

$request = Request::create('/api/users/1', 'GET');

$response = Route::dispatch($request);

$response现在包含API返回的响应。 通常,这将返回一个JSON编码字符串这是伟大的客户,但不是伟大的内部API请求。 你必须在这里延长了一些东西,但基本思路是通过回为内部调用返回实际的对象,并为外部请求返回JSON格式的响应。 您可以使用的东西像$response->getOriginalContent()这里这种事情。

你应该看看这样做是构建一些内部的Dispatcher ,可以让你派遣API请求并返回原来的对象。 调度员也应该处理畸形请求或不良反应,并抛出异常相匹配。

这个想法本身是固体。 但规划的API是艰苦的工作。 我建议你写你的所有预期端点的好名单,并起草了几个API的版本,然后选择最好的一个。



Answer 2:

注:由于vcardillo指出以下,路由过滤器不调用这些方法。

我目前正在做同样的事情,和杰森的回答让我在一个大的方向去。 综观的Symfony \分量\ HttpFoundation \请求的文档,我想通了,如何发布,以及一切我需要做的。 您使用的是形式假设,这里是一些代码,可以帮助你:

得到:

$request = Request::create('/api/users/1', 'GET');

$response = Route::dispatch($request);

POST:

$request = Request::create('/api/users/1', 'POST', Input::get());

$response = Route::dispatch($request);

POST W /饼干

$request = Request::create('/api/users/1', 'POST', Input::get(), Cookie::get('name'));

$response = Route::dispatch($request);

POST W /文件

$request = Request::create('/api/users/1', 'POST', Input::get(), null, Input::file('file'));

$response = Route::dispatch($request);

我希望这可以帮助别人。 如果您使用的不是形式,或者你但不使用Laravel的输入/ Cookie的门面,用自己的内容更换输入/ Cookie的门面。



Answer 3:

泰勒Otwell 建议使用app()->handle()而不是Route::dispatch()实现了清洁请求。

对于Route::dispatch($request)我注意到,如果你的非GET请求(在HTTP请求的身体参数)使用依赖注入了终点\Illuminate\Http\Request\Illuminate\Foundation\Http\FormRequest延长例如,的参数,饼干,文件等状态是从原来的HTTP请求。 即,对于您的应用程序控制器的操作方法。

如果参数名称和POST方法类型为您的应用程序控制器和API控制器是相同的,因为原来的参数值传给你不会注意到其中的差别。 但是当你手工组装的第三个参数Request::create() Route::dispatch()会导致它被忽略。

app()->handle()固定在Laravel请求生命周期这方面的问题。

警告: app()->handle()影响Illuminate\Support\Facades\Request ,这个新的请求实例刷新它。 作为一个连锁效应,呼吁像Request::isXmlHttpRequest()redirect()->back()之后被调用app()->handle()将导致不可预知的行为。 我建议跟踪你的原始请求的情况下,转而使用redirect()->to(route('...'))所以你严格控制你的应用程序的流量和状态。

考虑到所有这些角落的情况下,它可能是最好只是做使用手工卷曲狂饮HTTP客户端 。



Answer 4:

如果你消耗自己的API,使用app()->handle()而不是Route::dispatch()德里克·麦克唐纳曾建议。

app()->handle()创建了一个新的要求,而Route::dispatch()运行堆栈内的路线,有效地忽略这是你发送请求的部分参数。

编辑 :只是抬头。 泰勒Otwell 建议不要使用子请求进行内部API调用,因为他们乱七八糟的电流路径 。 您可以在HTTP API客户喜欢Guzzle ,而不是使API调用。



Answer 5:

您可以使用擎天柱API消费者 ,API是干净和简单,例如使内部请求:

$response = app()->make('apiconsumer')->post('/oauth/token', $data);

在它的核心,它采用Illuminate\Routing\RouterIlluminate\Http\Request拨打电话

// create the request
$this->request->create($uri, $method, $data, [], [], $server, $content);

// get the response
$response = $this->router->prepareResponse($request, $this->app->handle($request));


Answer 6:

如果您正在寻找内部使用护照登录API,那么你需要添加参数原始请求:

    protected function manualLogin(Request $request)
    {
        $email = $request->input('email');
        $password = $request->input('password');

        $request->request->add([
        'username' => $email,
        'password' => $password,
        'grant_type' => 'password',
        'client_id' => $clientID,
        'client_secret' => $clientSecret,
        'scope' => '*']);

    $newRequest = Request::create('/oauth/token', 'post');

    return Route::dispatch($newRequest)->getContent();
}


Answer 7:

如果您正在寻找内部使用护照登录API,那么你需要添加参数原始请求:

protected function manualLogin(Request $request)
{
    $email = $request->input('email');
    $password = $request->input('password');

    $request->request->add([
        'username' => $email,
        'password' => $password,
        'grant_type' => 'password',
        'client_id' => $clientID,
        'client_secret' => $clientSecret,
        'scope' => '*']);

    $newRequest = Request::create('/oauth/token', 'post');

    return Route::dispatch($newRequest)->getContent();
}


文章来源: Consuming my own Laravel API