
在 PHP 中使用 cURL 发起 GET 请求时,若需传递含花括号(如 JSON 字符串)的参数,必须先用 json_encode() 生成合法 JSON,再经 urlencode() 编码,否则 URL 解析错误或服务端无法正确接收。
在 php 中使用 curl 发起 get 请求时,若需传递含花括号(如 json 字符串)的参数,必须先用 `json_encode()` 生成合法 json,再经 `urlencode()` 编码,否则 url 解析错误或服务端无法正确接收。
当通过 GET 方法向 API 传递结构化数据(例如过滤条件、配置对象)时,开发者常尝试直接拼接类似 {"key":"value"} 的字符串作为查询参数。但花括号 {}、冒号 :、双引号 " 等字符在 URL 中属于保留或特殊字符,未经编码将导致:
- URL 解析失败(如被截断、误判为路径分隔符);
- 服务端收到损坏或空值;
- cURL 请求实际指向错误地址(如 example.com/api/?params={ 后被截断)。
✅ 正确做法是:先序列化,再编码——使用 json_encode() 生成标准 JSON 字符串,再用 urlencode() 转义为 URL 安全格式(如空格→%20,双引号→%22,花括号→%7B/%7D)。
示例代码如下:
<?php
$data = ['status' => 'active', 'limit' => 10, 'tags' => ['api', 'bot']];
$encodedJson = urlencode(json_encode($data));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/v1/data?payload={$encodedJson}");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>? 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- ❌ 避免手动拼接 JSON 字符串(如 "{'key':'val'}"),易引发语法错误且不可靠;
- ✅ 始终信任 json_encode() 的输出,并仅对最终字符串调用 urlencode();
- ⚠️ 若参数较长,注意 GET 请求的 URL 长度限制(通常 2KB–8KB,因服务器而异),超长建议改用 POST;
- ? 服务端接收时,PHP 可直接用 json_decode($_GET['payload'], true) 解析(确保已正确 urldecode —— PHP 自动处理,无需手动)。
总结:GET 请求中传递 JSON 不是“禁令”,而是需要遵循 URL 编码规范。json_encode() + urlencode() 是简洁、可靠、符合 RFC 3986 的标准解决方案。



















