
本文详解在 PHP 中通过 cURL 发送 JSON 请求时,如何安全、规范地将 PHP 变量(如 $_GET 参数)注入 JSON 结构,避免因字符串拼接错误或未转义导致的请求失败。
本文详解在 php 中通过 curl 发送 json 请求时,如何安全、规范地将 php 变量(如 `$_get` 参数)注入 json 结构,避免因字符串拼接错误或未转义导致的请求失败。
在使用 PHP 调用 UPS 等第三方 API 时,常需构造符合规范的 JSON 请求体(如 LabelRecoveryRequest)。一个典型误区是:试图在 JSON 字符串中直接内嵌 PHP 代码(如 "TrackingNumber": "echo json_encode($nam);"),这不仅语法错误(JSON 不解析 PHP 指令),更会将字面量 echo json_encode(...) 当作字符串值发送,导致 API 返回验证失败或空响应。
✅ 正确做法是:先构建 PHP 关联数组,再统一调用 json_encode() 序列化为合法 JSON 字符串。这种方式由 PHP 自动处理引号、转义、编码与数据类型映射,杜绝手动拼接引发的格式错误。
以下为优化后的完整示例(已适配 UPS Label Recovery 接口):
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
<?php
// 1. 安全获取并过滤输入(关键!)
$trackNumber = filter_input(INPUT_GET, 'tracknumber', FILTER_SANITIZE_STRING);
if (!$trackNumber) {
die('Error: Missing or invalid tracknumber parameter.');
}
// 2. 构建结构化请求数据(纯 PHP 数组)
$requestData = [
'LabelRecoveryRequest' => [
'LabelSpecification' => [
'HTTPUserAgent' => '',
'LabelImageFormat' => ['Code' => 'GIF'],
],
'LabelDelivery' => [
'LabelLinkIndicator' => '',
'ResendEMailIndicator' => '',
'EMailMessage' => ['EMailAddress' => ''],
],
// ✅ 直接赋值变量(无需引号包裹,PHP 会自动序列化为字符串)
'TrackingNumber' => $trackNumber,
]
];
// 3. 初始化 cURL 并设置选项
$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($requestData),
CURLOPT_HTTPHEADER => [
'Username: xxxxx',
'Password: xxxxx',
'AccessLicenseNumber: xxxxxxx',
'Content-Type: application/json',
'Accept: application/json'
],
]);
// 4. 执行请求并处理响应
$response = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
// 5. 基础错误检查
if ($response === false || $httpCode !== 200) {
error_log("UPS API Error: HTTP {$httpCode}, Response: " . substr($response, 0, 200));
die('Failed to retrieve label. Please check tracking number and credentials.');
}
// 6. 解析 Base64 图像(注意:实际响应结构请以 UPS 文档为准)
preg_match('/"GraphicImage"\s*:\s*"([^"]+)"/', $response, $matches);
if (isset($matches[1])) {
echo '@@##@@';
} else {
echo 'Label image not found in response.';
}
?>? 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 绝不手动拼接 JSON 字符串:如 "TrackingNumber": "$nam" 或 "TrackingNumber": "echo json_encode($nam);" 均属错误写法,前者易因特殊字符(如引号、反斜杠)破坏 JSON 结构,后者完全无效。
- 始终使用 json_encode():它确保所有字符串被正确加引号、转义(如 \n, "),数字/布尔值保持原生类型,且 UTF-8 编码安全。
- 输入验证不可省略:$_GET['tracknumber'] 必须经 filter_input() 或 htmlspecialchars() 等过滤,防止注入或空值导致 API 异常。
- 检查 HTTP 状态码:curl_getinfo($curl, CURLINFO_HTTP_CODE) 可第一时间识别认证失败(401)、参数错误(400)等服务端问题。
- 响应解析需健壮:正则匹配 GraphicImage 是临时方案,建议改用 json_decode($response, true) 解析完整 JSON,提升可维护性与准确性。
遵循此模式,你不仅能解决 UPS 标签请求问题,更能为所有 JSON API 集成建立可复用、安全、符合最佳实践的 PHP 开发范式。










