
本文详解如何在php中安全、规范地将动态变量(如$_get参数)嵌入json格式的curl请求体,避免字符串拼接错误,并推荐使用json_encode()构建结构化请求数据。
本文详解如何在php中安全、规范地将动态变量(如$_get参数)嵌入json格式的curl请求体,避免字符串拼接错误,并推荐使用json_encode()构建结构化请求数据。
在PHP中向API(如UPS Ship API)发送JSON请求时,常见误区是试图在双引号字符串内直接执行PHP代码(如 "TrackingNumber": "echo json_encode($nam);")。这种写法不仅语法错误——echo 是输出语句,不能在字符串中“运行”;更严重的是,它会导致JSON结构被破坏,引发API返回400 Bad Request或解析失败。
✅ 正确做法是:先构建PHP关联数组,再统一调用 json_encode() 序列化为合法JSON字符串。这既保证了数据类型安全(自动处理字符串转义、空值、特殊字符),又提升了可读性与可维护性。
以下为优化后的完整示例:
<?php
// 1. 获取并基础校验参数(生产环境务必强化验证!)
$trackNumber = $_GET['tracknumber'] ?? '';
if (empty($trackNumber) || !is_string($trackNumber)) {
die('Error: Missing or invalid tracking number.');
}
// 2. 构建请求数据结构(纯PHP数组,逻辑清晰)
$data = [
'LabelRecoveryRequest' => [
'LabelSpecification' => [
'HTTPUserAgent' => '',
'LabelImageFormat' => ['Code' => 'GIF'],
],
'LabelDelivery' => [
'LabelLinkIndicator' => '',
'ResendEMailIndicator' => '',
'EMailMessage' => ['EMailAddress' => ''],
],
// ✅ 直接赋值变量,无需手动拼接或echo
'TrackingNumber' => $trackNumber,
],
];
// 3. 发起cURL请求(使用json_encode确保JSON合法性)
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://onlinetools.ups.com/ship/v1/shipments/labels',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
// ✅ 关键:用json_encode()生成标准JSON,而非字符串拼接
CURLOPT_POSTFIELDS => json_encode($data),
CURLOPT_HTTPHEADER => [
'Username: xxxxx',
'Password: xxxxx',
'AccessLicenseNumber: xxxxxxx',
'Content-Type: application/json',
'Accept: application/json'
],
]);
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
// 4. 基础响应处理(注意:实际项目应检查HTTP状态码和API错误字段)
if ($response === false || $httpCode !== 200) {
error_log("UPS API Error: HTTP {$httpCode}, Response: " . substr($response, 0, 500));
die('Failed to retrieve label.');
}
// 5. 解析Base64图像(建议改用JSON解码而非正则匹配)
preg_match('/"GraphicImage"\s*:\s*"([^"]+)"/', $response, $matches);
if (!empty($matches[1])) {
echo '@@##@@';
} else {
die('Label image not found in response.');
}
?>? 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 绝不字符串拼接JSON:手动拼接(如 "TrackingNumber": "'.$nam.'")极易因引号、反斜杠、Unicode等导致JSON非法,且存在注入风险;
- 始终使用 json_encode():它会自动处理转义、编码、数据类型映射(如 null → null,true → true);
- 输入必须过滤与校验:$_GET['tracknumber'] 可能为空、含恶意字符或超长,建议配合 filter_var()、正则校验(如 /^[A-Za-z0-9-]+$/)及长度限制;
- 启用错误报告:开发阶段添加 error_reporting(E_ALL); ini_set('display_errors', 1); 快速定位JSON编码失败(如非UTF-8字符);
- 优先解析JSON响应:示例中用正则提取 GraphicImage 属临时方案;理想做法是 json_decode($response, true) 后访问 $decoded['LabelRecoveryResponse']['LabelResults']['LabelImage']。
掌握这一模式,不仅能解决UPS接口问题,更是PHP与RESTful API交互的标准实践——结构化构造、安全序列化、健壮容错。











