
本文详解 wp_remote_post() 发送嵌套 JSON 有效载荷时的常见错误,重点解决因未正确序列化导致接收端显示 [object Object] 的问题,并提供可直接复用的配置示例与最佳实践。
本文详解 wp_remote_post() 发送嵌套 json 有效载荷时的常见错误,重点解决因未正确序列化导致接收端显示 `[object object]` 的问题,并提供可直接复用的配置示例与最佳实践。
在 WordPress 开发中,wp_remote_post() 是调用外部 API 的常用函数。但当需发送结构化嵌套 JSON(如将数据包裹在顶层键 stock_data 下)时,开发者常误以为仅需 wp_json_encode() 数组即可——实际上,关键在于:必须确保整个请求体是合法、扁平化的 JSON 字符串,且 Content-Type 明确声明为 application/json,同时避免 WordPress 自动表单编码干扰。
你遇到的 stock_data: [object Object] 错误,根本原因并非 PHP 数组结构有误,而是 wp_remote_post() 在默认行为下,若传入已 JSON 编码的字符串作为 'body',却未禁用其自动表单格式化逻辑,可能导致部分服务端(尤其是 JavaScript 环境)错误解析为未展开对象。更准确地说:该现象多见于接收方使用 JSON.parse() 处理原始请求体失败,或前端调试工具(如浏览器 DevTools)对非标准响应头的显示误导——但核心仍指向发送端未严格遵循 JSON POST 规范。
✅ 正确做法如下:
-
构造纯 PHP 关联数组(无需预先编码):
$body = [ 'stock_data' => [ 'post_title' => $title, 'post_content' => $content, 'post_date' => $postdate, 'post_category' => $categoryname, ], ]; -
显式 JSON 编码 + 设置 headers(关键!):
$json_body = wp_json_encode( $body );
$options = [ 'body' => $json_body, // 已编码的字符串 'headers' => [ 'Content-Type' => 'application/json; charset=utf-8', 'Content-Length' => strlen( $json_body ), // 推荐显式声明,提升兼容性 ], 'timeout' => 60, 'redirection' => 5, 'blocking' => true, 'httpversion' => '1.1', // 建议使用 1.1 而非 1.0 'sslverify' => false, // 生产环境请设为 true 并配置 CA 证书 ];
3. **发起请求**:
```php
$response = wp_remote_post( $endpoint, $options );
if ( is_wp_error( $response ) ) {
error_log( 'API request failed: ' . $response->get_error_message() );
} else {
$status_code = wp_remote_retrieve_response_code( $response );
$body_result = wp_remote_retrieve_body( $response );
// 处理响应...
}
⚠️ 注意事项:
-
切勿省略
Content-Type: application/json—— 这是服务端决定如何解析请求体的关键依据; -
避免混用
body和form-data风格:若'body'是 JSON 字符串,则整个请求必须是纯 JSON;不要同时设置'multipart' => true或依赖 WordPress 自动序列化; -
验证 JSON 有效性:发送前可用
is_json($json_body)(自定义函数)或json_last_error()检查编码是否成功; -
调试技巧:在接收端打印原始
file_get_contents('php://input'),确认接收到的是完整 JSON 字符串而非 URL 编码内容; -
安全性提醒:生产环境中务必启用
'sslverify' => true,并考虑添加 API 认证头(如Authorization: Bearer xxx)。
总结:wp_remote_post() 发送嵌套 JSON 的本质是「发送标准化 HTTP JSON 请求」,而非「传递 PHP 数组」。只要确保 body 是合法 JSON 字符串、Content-Type 准确、且无其他参数干扰编码逻辑,stock_data 就会以完整对象形式抵达目标端点。











