我使用Dingo和Laravel 5.1来创建简单的API。
所以在route.php我有:
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function($api) {
$api->get('getvoucher', 'App\Http\Controllers\BitemsController@index');
$api->get('update/{key}', 'App\Http\Controllers\BitemsController@update');
$api->post('store', 'App\Http\Controllers\BitemsController@store');
$api->post('authenticate', 'App\Http\Controllers\AuthenticateController@authenticate');
$api->post('logout', 'App\Http\Controllers\AuthenticateController@logout');
$api->get('token', 'App\Http\Controllers\AuthenticateController@getToken');
});
和我的BitemsController是:
public function index(Request $request)
{
$bitem = Bitem::where('key',$request->key)->where('id',$request->pin)->first();
return $bitem;
}
public function store(Request $request)
{
$bitem = new Bitem($request->all());
$bitem->save;
return $bitem;
}
现在我使用POSTMAN应用程序来测试API,当我将GET发送到localhost时:8888 / api / getvoucher一切都很好,但是当我发出POST请求来存储一些数据时,我得到了错误:
"message": "500 Internal Server Error",
"status_code": 500,
"debug": {
"line": 53,
"file": "C:\\wamp\\www\\dine\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php",
"class": "Illuminate\\Session\\TokenMismatchException",
"trace": [
要解决此问题,我尝试添加:
protected $except = [
'api/*',
];
在中间件VerifyCsrfToken.php中,但是工作。
请告诉我如何解决我的问题...
答案 0 :(得分:4)
要使邮递员工作,您需要发送正确的CSRF标题,或者删除路线上的标题。
我假设根据您的屏幕截图,您的Dingo API路线正在使用API_PREFIX=api
in your .env
file。
检查Laravel documentation on CSRF tokens以获取有关这些的更多信息。 gist that @BM2ilabs suggested有一些基础知识,介绍如何找出您在会话中用于本地测试的CSRF令牌,以便放入邮递员。
如果您不想使用CSRF保护,则使用$except
property on the VerifyCsrfToken
middleware as per the Laravel documentation是正确的 - 这也是come up on Stack Overflow before。如果没有看到您正在使用的Kernel
和完整的中间件文件,那就很麻烦。如果$except
属性确实不适合您,您可以始终覆盖VerifyCsrfToken::handle()
方法as per this post并添加您喜欢的路径检查:
public function handle($request, Closure $next)
{
if ( ! $request->is('api/*'))
{
return parent::handle($request, $next);
}
return $next($request);
}
如果您仅创建一个无状态且不需要CSRF保护的API,您可以在{{1}中注释掉VerifyCsrfToken
中间件的使用情况完全(可能还有一些其他会话中间件),虽然我建议使用某种身份验证/验证,允许访问者访问API端点。
答案 1 :(得分:1)
您只需要在帖子中添加csrf_token
,但邮递员可能会觉得棘手
添加标题与您使用的内容 例如Axios:
it already has that integrated
jQuery Ajax
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
了解更多info's
<强>更新强>
经过一番搜索,我发现这篇文章展示了如何让csrf与POSTMAN
一起使用