63 lines
2.1 KiB
PHP
63 lines
2.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Constants\ErrorCode;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class ValidateHeaders
|
|
{
|
|
/**
|
|
* 处理请求
|
|
*
|
|
* @param Request $request
|
|
* @param Closure $next
|
|
* @return Response
|
|
*/
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
// 检查 Content-Type
|
|
if ($request->isMethod('POST') || $request->isMethod('PUT') || $request->isMethod('PATCH')) {
|
|
if (!$request->hasHeader('Content-Type') || !str_contains($request->header('Content-Type'), 'application/json')) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'error' => ErrorCode::INVALID_REQUEST_FORMAT,
|
|
'message' => '请求头必须包含 Content-Type: application/json',
|
|
], Response::HTTP_BAD_REQUEST);
|
|
}
|
|
}
|
|
|
|
// 检查 Accept
|
|
if (!$request->hasHeader('Accept') || !str_contains($request->header('Accept'), 'application/json')) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'error' => ErrorCode::INVALID_REQUEST_FORMAT,
|
|
'message' => '请求头必须包含 Accept: application/json',
|
|
], Response::HTTP_BAD_REQUEST);
|
|
}
|
|
|
|
// 检查 API 版本
|
|
if (!$request->hasHeader('X-API-Version')) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'error' => ErrorCode::INVALID_REQUEST_FORMAT,
|
|
'message' => '请求头必须包含 X-API-Version',
|
|
], Response::HTTP_BAD_REQUEST);
|
|
}
|
|
|
|
// 检查客户端标识
|
|
if (!$request->hasHeader('X-Client-ID')) {
|
|
return response()->json([
|
|
'success' => false,
|
|
'error' => ErrorCode::INVALID_REQUEST_FORMAT,
|
|
'message' => '请求头必须包含 X-Client-ID',
|
|
], Response::HTTP_BAD_REQUEST);
|
|
}
|
|
|
|
return $next($request);
|
|
}
|
|
}
|