llmbackend/app/Http/Middleware/ValidateHeaders.php
Jethro Lin c5258233a8 5. [请求与响应格式](#5-请求与响应格式)
- [5.1 通用请求头](#51-通用请求头)
   - [5.2 响应格式](#52-响应格式)
6. [错误代码](#6-错误代码)
7. [安全性考虑](#7-安全性考虑)
2024-12-04 12:14:43 +08:00

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