You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:47:08