Slim3框架如何返回100 Continue并处理Expect请求头?
当然可以在Slim3框架里实现这个需求!处理Expect: 100-continue请求头的核心思路是先给客户端返回100 Continue响应,让它开始发送请求体,之后再执行你的业务逻辑并返回最终状态码。下面我给你详细拆解实现步骤和代码示例:
实现思路
当客户端发送带有Expect: 100-continue的请求时,它是在询问服务器:"我有一个大请求体要发送,你准备好了吗?"。我们需要先返回100 Continue告诉客户端可以发送请求体,接着执行自己的业务逻辑,最后返回200 Success或其他状态码。
Slim3本身没有封装直接返回100 Continue的方法,但我们可以通过操作底层的HTTP响应头和输出缓冲区来实现。
具体实现方案
方案一:全局中间件(推荐,通用处理)
如果你的多个路由都需要处理这种请求,用中间件是最优雅的方式——它可以全局拦截请求,统一处理Expect头逻辑。
1. 创建中间件类
<?php use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; class ExpectContinueMiddleware { public function __invoke(Request $request, Response $response, $next) { // 检查请求头是否包含"Expect: 100-continue" $expectHeader = $request->getHeaderLine('Expect'); if (strtolower(trim($expectHeader)) === '100-continue') { // 发送100 Continue响应头 header('HTTP/1.1 100 Continue'); header('Connection: keep-alive'); // 强制刷新输出缓冲区,确保响应立即发送给客户端 ob_flush(); flush(); } // 继续执行后续的中间件或路由逻辑 $response = $next($request, $response); return $response; } }
2. 注册中间件到Slim应用
$app = new Slim\App(); // 注册全局中间件(所有请求都会经过它) $app->add(new ExpectContinueMiddleware()); // 示例路由:处理POST请求 $app->post('/upload', function (Request $request, Response $response) { // 这里执行你的特定业务逻辑,比如解析请求体、处理文件上传等 $requestBody = $request->getParsedBody(); // 模拟耗时操作(比如文件处理) sleep(3); // 返回最终的成功响应 return $response->withJson(['status' => 'success', 'message' => '处理完成'], 200); }); $app->run();
方案二:路由内直接处理
如果只有单个路由需要处理这种请求,也可以直接在路由回调里写逻辑,省去中间件的步骤:
$app = new Slim\App(); $app->post('/api/submit', function (Request $request, Response $response) { // 检查Expect头 $expectHeader = $request->getHeaderLine('Expect'); if (strtolower(trim($expectHeader)) === '100-continue') { // 发送100 Continue响应 header('HTTP/1.1 100 Continue'); ob_flush(); flush(); } // 执行你的业务逻辑 $data = $request->getParsedBody(); // ... 数据处理、数据库操作等逻辑 // 返回最终响应(这里用400示例错误场景) if (empty($data['required_field'])) { return $response->withJson(['error' => '缺少必填字段'], 400); } return $response->withJson(['status' => 'success'], 200); }); $app->run();
关键注意事项
- 输出缓冲区处理:PHP默认可能开启输出缓冲,所以必须用
ob_flush()和flush()强制把100 Continue响应发送给客户端,否则客户端会一直等待。 - 请求体时机:只有当客户端收到
100 Continue后,才会发送请求体,所以你的业务逻辑要放在发送100之后执行,确保能正确获取到请求体内容。 - 无响应体:
100 Continue是一个临时响应,不需要包含任何响应体,只需要发送状态码和必要的头即可。
内容的提问来源于stack exchange,提问作者saulsluz
相关产品推荐
相关产品推荐

