WordPress调用外部API返回PDF二进制文件被双引号包裹问题求助
问题原因
WordPress REST API 会默认对所有 WP_REST_Response 返回的内容执行 JSON 序列化处理。你返回的 PDF 二进制内容是字符串类型,被 JSON 序列化后就会自动在外层包裹双引号,同时换行符等特殊字符也会被转义,和编码设置无关。
解决方案
不要通过 WP_REST_Response 返回二进制内容,直接手动输出响应头和PDF内容后终止进程,跳过WordPress默认的JSON序列化逻辑即可。
修改控制器代码如下:
public function generateSummary(WP_REST_Request $request, GenerateSummary $data) { // ...原有其他逻辑保持不变 try { $summary = $data->execute( $this->getUserId(), $moduleId ); } catch (ActionFailedException $e) { return new WP_Error( 'store_error', $e->getMessage(), ['status' => 422] ); } // 清空之前可能的异常输出 ob_clean(); // 设置响应头 header('Content-Type: application/pdf'); // 如果需要强制下载文件,可添加下面这行,修改filename为你想要的文件名 // header('Content-Disposition: attachment; filename="summary.pdf"'); // 可选:添加Content-Length头保证传输准确性 header('Content-Length: ' . strlen($summary['body'])); // 直接输出PDF原始内容 echo $summary['body']; // 终止执行,避免WordPress后续处理追加其他内容 exit; }
可选兼容方案
如果你不想直接用exit终止进程,可以通过rest_pre_serve_request过滤器跳过默认的响应序列化逻辑:
public function generateSummary(WP_REST_Request $request, GenerateSummary $data) { // ...前面的逻辑保持不变 $summary = $data->execute($this->getUserId(), $moduleId); add_filter('rest_pre_serve_request', function ($served, $result, $request, $server) use ($summary) { if ($served) return $served; header('Content-Type: application/pdf'); echo $summary['body']; return true; }, 10, 4); // 返回空响应即可,实际输出由上面的过滤器处理 return new WP_REST_Response('', 200); }
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

