如何将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的序列化机制会进一步处理内容,导致无法正确输出原始二进制图片。
修改步骤如下:
获取原始二进制数据
在wp_remote_get的参数中添加'encoding' => 'raw',确保获取到HubSpot返回的原始GIF二进制数据,避免自动转义;同时添加Accept头明确指定接受GIF格式:$args = array( 'method' => 'GET', 'headers' => array( 'Authorization' => 'Bearer ' . $token, 'Accept' => 'image/gif' ), 'encoding' => 'raw' // 关键:获取原始二进制数据 );直接输出二进制数据,绕过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
相关产品推荐
相关产品推荐

