
本文详解在 PHP 中调用 REST API 时,如何正确将关联数组作为对象嵌入 POST 参数(如 data 字段),并以 JSON 格式提交——关键在于使用 json_encode() 发送请求体,并设置 Content-Type: application/json,而非默认的表单编码。
本文详解在 php 中调用 rest api 时,如何正确将关联数组作为对象嵌入 post 参数(如 `data` 字段),并以 json 格式提交——关键在于使用 `json_encode()` 发送请求体,并设置 `content-type: application/json`,而非默认的表单编码。
在对接第三方 API(尤其是企业级服务或开发者挑战任务)时,常遇到一个典型问题:某个请求参数(例如 data)要求传入结构化对象(如 { "Email": "x@y.z", "URL": "https://github.com/..." }),而非简单字符串或扁平键值对。此时若错误地使用 application/x-www-form-urlencoded 编码(即 http_build_query),嵌套数组会被序列化为形如 data[Email]=...&data[URL]=... 的扁平字符串,导致服务端无法解析为原始对象,最终表现为 data 字段“为空”。
✅ 正确做法是:将整个请求体作为 JSON 对象发送,并显式声明 Content-Type: application/json。
以下为推荐实现(已优化可读性与健壮性):
<?php
$myWork = [
'Email' => 'MY_EMAIL',
'URL' => 'REPOSITORY_URL',
];
$url = 'https://api.xxxxxxx.com/';
$data = [
'key' => 'MY_API_KEY',
'base' => 'MY_TOKEN',
'data' => $myWork, // 直接嵌入关联数组,无需 json_decode(json_encode(...))
];
$options = [
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n",
'content' => json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES),
]
];
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
if ($result === false) {
throw new RuntimeException('HTTP request failed: ' . print_r(error_get_last(), true));
}
$response = json_decode($result, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new RuntimeException('Invalid JSON response: ' . $result);
}
print_r($response);
?>? 关键要点说明:
- 不要对 $myWork 做 json_decode(json_encode(...)) 处理:这不仅冗余,还可能因类型转换丢失原始结构(如空数组变空对象),且对关联数组完全无必要。
- content 必须是 json_encode($data):确保整个请求体是合法 JSON 字符串,服务端才能按 JSON 解析 data 字段为对象。
- Content-Type 必须设为 application/json:这是服务端识别并启用 JSON 解析器的前提;若仍用 application/x-www-form-urlencoded,即使内容是 JSON,服务端通常会忽略或报错。
- 建议添加基础错误处理:检查 file_get_contents 返回值、JSON 解析结果,避免静默失败。
- 可选优化:json_encode() 加入 JSON_UNESCAPED_UNICODE 和 JSON_UNESCAPED_SLASHES,提升中文和 URL 字段的可读性与兼容性。
⚠️ 注意事项:
- 确认目标 API 文档是否明确要求 JSON 格式(多数现代 REST API 默认如此);
- 若文档未说明,但实测 application/x-www-form-urlencoded 失败,应优先尝试 JSON 方案;
- 避免混合编码方式(如部分字段 URL 编码、部分 JSON),保持请求体格式统一。
综上,正确传递对象型参数的核心逻辑是:构造原生 PHP 数组 → 整体 JSON 序列化 → 设置对应 Content-Type → 发送。这一模式简洁、标准,且与绝大多数现代 API 兼容。


















