我正在尝试使用Laravel创建REST API。我正在使用JWT(Tymon \ JWTAuth)对用户进行身份验证。
这是我的api.php文件的一部分,带有/ api路由:
Route::middleware('auth:api')->get("match/{id}", "ApiMatchController@getMatch");
Route::middleware('auth:api')->put("match/{id}", "ApiMatchController@editMatch");
现在,我正在将GET请求发送到/api/match/7
。授权用户将按预期获得比赛详细信息。未经授权的用户被重定向到根URL /
,但是我希望用户保留在该URL上,我只想返回HTTP代码401-未经授权。我在哪里可以更改?我可以在ApiMatchController@getMatch
方法中执行此操作,但我希望中间件auth:api
为我执行此操作。有什么办法吗?
然后,我将一些数据发送到PUT请求到/api/match/7
。来自授权用户的请求工作正常,但未授权用户现在获得HTTP代码405-不允许使用方法(带有调试信息:Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: The PUT method is not supported for this route. Supported methods: GET, HEAD.
)。为什么?我清除了路由缓存,如您所见,在api.php中有一个已定义的路由。只有未经授权的用户才会发生这种情况。
答案 0 :(得分:0)
关于第一部分:
授权用户可以按预期获得比赛详细信息。未经授权的用户重定向到根url /,但我希望用户保留在url上,我只想返回HTTP代码401-未经授权。我在哪里可以更改?
这是因为您的默认防护是web
,因此在这种情况下,当用户尝试访问受保护的路由时,它将被重定向到主页(默认情况下,当然也可以自定义)。 / p>
要将默认防护设置更改为api
,请转到config/auth.php
并进行如下更改:
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
注意:在发出HTTP请求时,请添加以下标头:
/** The following tells Laravel that you want a response in json format. */
Accept: application/json
/** The following is for POST/PUT/PATCH requests, it tells the request payload format. */
Content-type: application/json
关于第二部分:
来自授权用户的请求工作正常,但未经授权的用户现在获得HTTP代码405-不允许的方法
PHP doesn't handle well PUT
/ PATCH
/ DELETE
方法,为了绕过这种不便之处,请执行POST请求,然后添加一个隐藏的_method
字段到表格。
通过_method字段发送的值将用作HTTP请求方法:
请求正文(该方法是区分大小写的):
Endpoint:
/api/match/7
Headers:
Accept: application/json
Content-type: application/json
Payload or Body:
_method: PUT
...