Symfony 5调用setStatusCode()设置201后返回200且响应头混入正文问题
问题根源
你的代码存在响应对象嵌套的错误:JsonResponse本身已经是Symfony响应类的子类,可以直接作为控制器返回值,你额外套了一层Response,触发了两个问题:
- 外层新生成的
Response默认状态码为200,覆盖了你内层设置的201状态码 Response构造方法的第一个参数要求传入字符串类型的响应体,你传入JsonResponse对象时,PHP会自动将该对象转为包含完整头信息、状态码、响应体的字符串,全部塞进外层响应的body中,因此你会看到头信息混入响应体的异常表现。
修复方案
直接返回你配置好的JsonResponse即可,不需要额外套Response:
// RETURN MESSAGE $body = [ 'auth_token' => $jwt, ]; // 构造方法直接传状态码更简洁,也可以用你原来的setStatusCode写法 $json = new JsonResponse($body, 201); // 推荐使用Symfony内置常量代替硬编码状态码,可读性更强: // $json = new JsonResponse($body, Response::HTTP_CREATED); return $json;
如果你需要使用原生Response实现同等效果,写法如下:
$body = [ 'auth_token' => $jwt, ]; return new Response( json_encode($body), 201, ['Content-Type' => 'application/json'] );
内容的提问来源于stack exchange,提问作者FourBars
相关产品推荐
相关产品推荐

