You need to enable JavaScript to run this app. WordPress调用外部API返回PDF二进制文件被双引号包裹问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 01:51:02