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

如何将API返回的GIF二进制字符串转换为image/gif格式图片文件?

问题:WP REST API代理HubSpot Events API返回转义GIF字符串,无法识别为图片

我搭建了一个API端点以规避调用HubSpot Events HTTP API时的CORS问题,该Events API会返回image/gif格式图片响应,示例请求链接为:
https://track.hubspot.com/v1/event?_n=000000001625&_a=62515&email=testingapis@hubspot.com

通过WP Rest API创建的代理端点代码如下:

function hs_events_api_call( $data ) {

    if ( empty( $data ) ) {
        return null;
    }

    $token = "my-token";
    $endpoint = 'https://track.hubspot.com/v1/event';
    $hubId = "my-hubid";

    $required['_a'] = $hubId;
    $required['_n'] = $data["eventid"];
    $required['email'] = $data->get_param( 'email' );

    $query_string = build_query_string($required);

    $args = array(
        'method'      => 'GET',
        'headers'     => array(
            'Authorization' => 'Bearer ' . $token,
            'Content-Type' => 'application/json'
        ),
    ); 

    $url = $endpoint.'?'.$query_string;
    
    $request = wp_remote_get( esc_url_raw( $url ), $args )["body"];

    if( empty( $request ) ) {
        return null;
    }

    $response = new WP_REST_Response($request);
    $response->set_status(200);
    $response->header('Content-Type', 'image/gif');

    return $response;
}

当前问题是该端点返回的是转义后的GIF二进制字符串,示例内容为:

"GIF89a\u0001\u0000\u0001\u0000?\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000!?\u0004\u0001\u0000\u0000\u0000\u0000,\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000@\b\u0004\u0000\u0001\u0004\u0004\u0000;"

请问如何将其转换输出为image/gif类型的图片文件?是否可行?


解决方案

完全可行,问题出在两个核心点:一是wp_remote_get默认会将二进制数据转义为带Unicode序列的字符串;二是WP_REST_Response的序列化机制会进一步处理内容,导致无法正确输出原始二进制图片。

修改步骤如下:

  1. 获取原始二进制数据
    在wp_remote_get的参数中添加'encoding' => 'raw',确保获取到HubSpot返回的原始GIF二进制数据,避免自动转义;同时添加Accept头明确指定接受GIF格式:

    $args = array(
        'method'      => 'GET',
        'headers'     => array(
            'Authorization' => 'Bearer ' . $token,
            'Accept' => 'image/gif'
        ),
        'encoding' => 'raw' // 关键:获取原始二进制数据
    ); 
    
  2. 直接输出二进制数据,绕过WP REST的序列化
    不要使用WP_REST_Response,而是直接设置HTTP响应头,输出原始二进制内容后终止脚本,避免WP的自动序列化处理:

    // 替换原有的响应构建代码
    if( empty( $request_body ) ) {
        return new WP_Error( 'empty_response', 'No response from HubSpot', array( 'status' => 500 ) );
    }
    
    // 设置正确的响应头
    header( 'Content-Type: image/gif' );
    header( 'Content-Length: ' . strlen( $request_body ) ); // 帮助客户端识别数据长度
    echo $request_body;
    exit; // 终止脚本,避免WP输出额外内容
    

修改后的完整代码

function hs_events_api_call( $data ) {

    if ( empty( $data ) ) {
        return new WP_Error( 'empty_data', 'No input data provided', array( 'status' => 400 ) );
    }

    $token = "my-token";
    $endpoint = 'https://track.hubspot.com/v1/event';
    $hubId = "my-hubid";

    $required['_a'] = $hubId;
    $required['_n'] = $data["eventid"];
    $required['email'] = $data->get_param( 'email' );

    // 验证必填参数
    if ( empty( $required['_n'] ) || empty( $required['email'] ) ) {
        return new WP_Error( 'missing_params', 'Required parameters missing', array( 'status' => 400 ) );
    }

    $query_string = http_build_query($required); // 替换为PHP标准函数,避免自定义函数报错

    $args = array(
        'method'      => 'GET',
        'headers'     => array(
            'Authorization' => 'Bearer ' . $token,
            'Accept' => 'image/gif'
        ),
        'encoding' => 'raw'
    ); 

    $url = $endpoint.'?'.$query_string;
    $response = wp_remote_get( esc_url_raw( $url ), $args );

    // 检查请求是否成功
    if ( is_wp_error( $response ) ) {
        return new WP_Error( 'request_failed', $response->get_error_message(), array( 'status' => 500 ) );
    }

    $request_body = wp_remote_retrieve_body( $response );

    if( empty( $request_body ) ) {
        return new WP_Error( 'empty_response', 'No response from HubSpot', array( 'status' => 500 ) );
    }

    // 输出GIF图片
    header( 'Content-Type: image/gif' );
    header( 'Content-Length: ' . strlen( $request_body ) );
    echo $request_body;
    exit;
}

额外说明

  • 替换了build_query_string为PHP标准函数http_build_query,避免自定义函数不存在导致的错误。
  • 添加了参数验证和错误处理,让端点更健壮。
  • 使用wp_remote_retrieve_body替代直接取数组索引["body"],是更安全的WP API用法,避免数组索引不存在的报错。

内容的提问来源于stack exchange,提问作者Jan Michael Intia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:10:37