代码之家  ›  专栏  ›  技术社区  ›  George Hanson

无法向Laravel终结点发出HTTP请求

  •  1
  • George Hanson  · 技术社区  · 7 年前

    我在一个测试中尝试发出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:clear php 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);
        }
    }
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   N69S    7 年前

    你为什么不把这两条路都放在 contacts 小组?

    $router->group(['prefix' => '/v1', 'middleware' => ['auth:api']], function (\Illuminate\Routing\Router $router) {
        $router->group(['prefix' => '/contacts'], function (\Illuminate\Routing\Router $router) {
            $router->apiResource('/', 'ContactsController');
            $router->apiResource('/groups', 'Contacts\\GroupsController');
        });
    });
    
        2
  •  0
  •   George Hanson    6 年前

    我好像已经弄明白了。如果我重新安排路线

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

    POST PUT

    https://github.com/laravel/framework/issues/26038


    更新

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

    /contacts/{contact} .

    从这条路走下去 contacts/groups 联系人/组 必须在 /联系人/{contact} 因为它是一个通配符。我不确定这是否是有意的行为,但目前只要有相反的路线就可以解决这个问题。