首页 > 解决方案 > 无法向 Laravel 端点发出 HTTP 请求

问题描述

在我的一项测试中尝试发出 HTTP 请求时,我遇到了一个非常奇怪的问题。我的api.php路线文件如下所示:

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], 
    function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/contacts', 'ContactsController');

        $router->group(['prefix' => '/contacts'], 
            function (\Illuminate\Routing\Router $router) {
                $router->apiResource('/groups', 'Contacts\\GroupsController');
        });
});

运行php artisan route:list显示以下路由已注册

+------------+------------------------+--------------+------------------------------------------------------+----------------+
|   Method   |           URI          |      Name    |                        Action                        |   Middleware   |
+------------+------------------------+--------------+------------------------------------------------------+----------------+
| GET|HEAD   | api/v1/contacts/groups | groups.index | App\Http\Controllers\Contacts\GroupsController@index |  api auth:api  |
+------------+------------------------+--------------+------------------------------------------------------+----------------+

但是,当我运行测试时,我得到了 404 响应。测试如下:

public function testICanGetAllOfTheGroups()
{
    factory(Group::class)->times(3)->create();

    $this->json('GET', '/api/v1/contacts/groups')
            ->assertStatus(200)->assertJsonCount(3);
}

我也尝试过跑步php artisan route:clearphp artisan cache:clear但并没有什么不同。

对于身份验证,我创建了以下我正在使用的特征。

trait Authenticated
{
    /** @var \App\Models\User */
    protected $user;

    public function setUp()
    {
        parent::setUp();

        $this->user = factory(User::class)->create();
        Passport::actingAs($this->user);
    }
}

标签: phplaravel

解决方案


我似乎已经想通了。如果我重新安排路线

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], function (\Illuminate\Routing\Router $router) {
    $router->apiResource('/contacts', 'ContactsController');

    $router->group(['prefix' => '/contacts'], function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/groups', 'Contacts\\GroupsController');
    });
});

$router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], function (\Illuminate\Routing\Router $router) {
    $router->group(['prefix' => '/contacts'], function (\Illuminate\Routing\Router $router) {
        $router->apiResource('/groups', 'Contacts\\GroupsController');
    });

    $router->apiResource('/contacts', 'ContactsController');
});

然后它工作。我怀疑这是 Laravel 如何注册其路由的错误,POST并且PUT请求仍然可以正常工作。

我在 GitHub 上将此作为错误提出 - https://github.com/laravel/framework/issues/26038


更新

我现在已经确定了这个问题。基本上apiResource,将端点之一转换为:

/contacts/{contact}.

继那条路线之后是contacts/groups. 然而,为了让 Laravel 匹配它,contacts/groups它需要在之前/contacts/{contact},因为它是一个通配符。我不确定这是否是故意的行为,但目前只是让路线反过来解决了这个问题。


推荐阅读