php - 无法向 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: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);
}
}
解决方案
我似乎已经想通了。如果我重新安排路线
$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}
,因为它是一个通配符。我不确定这是否是故意的行为,但目前只是让路线反过来解决了这个问题。
推荐阅读
- android - Android (iOS) 上的 React-Native 本机模块对象渲染
- c# - 在 CIMInstance 中转换参数
- android - Sceneform for ARCore 创建盒子方法
- python - 使用 PyTorch 进行 Tensorboard 图形可视化
- wordpress - Woocommerce 504 关于具有六个属性的产品
- c# - c#中的单例类
- mysql - MySQL中的错误时间戳
- lstm - Pytorch LSTM - 问答分类训练
- vba - 错误 440:对象“PivotCaches”的方法“创建”失败
- javascript - 在客户端授权贝宝付款并在服务器上捕获付款