news 2026/4/17 12:26:13

蓝易云 - PHP用CURL发送Content-type为application/json的POST请求方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
蓝易云 - PHP用CURL发送Content-type为application/json的POST请求方法

下面给你一套在 PHP 里用 cURL 发送 Content-Type: application/json 的 POST 请求的“标准企业写法”:结构清晰、可复用、可排障,适合直接丢进生产代码库🙂


一、最关键的点(先把坑堵死)

  1. 请求体必须是 JSON 字符串:用json_encode()生成,而不是http_build_query()

  2. 必须显式设置 Content-Type:Content-Type: application/json; charset=utf-8

  3. 建议带上 Content-Length:部分网关/安全设备更“挑剔”。

  4. 服务端返回如果是 JSON,建议设置 Accept: application/json,便于协商。


二、可直接复用的完整示例(含超时、错误处理、响应解析)✅

<?php $url = "https://api.example.com/v1/order/create"; $payload = [ "user_id" => 10001, "amount" => 99.50, "remark" => "test", ]; // 1) 将数组编码成 JSON 字符串(这是 application/json 的核心) $jsonBody = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($jsonBody === false) { throw new RuntimeException("JSON 编码失败: " . json_last_error_msg()); } $ch = curl_init($url); // 2) 关键请求头:明确告诉服务端“我发的是 JSON”,也表明“我期望 JSON 响应” $headers = [ "Content-Type: application/json; charset=utf-8", "Accept: application/json", "Content-Length: " . strlen($jsonBody), ]; curl_setopt_array($ch, [ CURLOPT_POST => true, // 使用 POST 方法 CURLOPT_POSTFIELDS => $jsonBody, // POST 请求体:必须是 JSON 字符串 CURLOPT_HTTPHEADER => $headers, // 设置请求头 CURLOPT_RETURNTRANSFER => true, // 返回响应内容为字符串(不直接输出) CURLOPT_CONNECTTIMEOUT => 5, // 连接超时(秒) CURLOPT_TIMEOUT => 15, // 总超时(秒) CURLOPT_FAILONERROR => false, // 不让 4xx/5xx 直接导致 curl_exec 返回 false(方便读响应体排错) ]); $responseBody = curl_exec($ch); // 3) 网络层错误:DNS、连接失败、TLS 握手失败等 if ($responseBody === false) { $errno = curl_errno($ch); $error = curl_error($ch); curl_close($ch); throw new RuntimeException("cURL 请求失败 [{$errno}]: {$error}"); } // 4) 协议层信息:HTTP 状态码、Content-Type 等 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); curl_close($ch); // 5) 按需解析 JSON 响应(如果服务端确实返回 JSON) $data = null; if (is_string($contentType) && stripos($contentType, "application/json") !== false) { $data = json_decode($responseBody, true); } // 6) 业务层处理示例:按 HTTP 状态码做分流 if ($httpCode >= 200 && $httpCode < 300) { // 成功:优先用解析后的数组;解析失败则回退原始响应 var_dump($data ?? $responseBody); } else { // 失败:把响应体也带上,便于排查(网关经常会回 JSON 错误详情) throw new RuntimeException("HTTP 请求失败,状态码={$httpCode},响应={$responseBody}"); }

逐段解释(对应你最常踩的点)

  • json_encode(...):把 PHP 数组变成 JSON 字符串,这一步决定服务端能不能按 JSON 解析。

  • CURLOPT_POSTFIELDS:你传进去什么,HTTP Body 就是什么。要发 JSON,就必须传 JSON 字符串。

  • CURLOPT_HTTPHEADER:这里把 Content-Type 定死为application/json,否则服务端可能按表单解析导致字段丢失。

  • CURLOPT_RETURNTRANSFER:拿到响应字符串,方便你写日志、做重试、做告警。

  • CURLINFO_HTTP_CODE:把网络成功与业务成功分开看,避免“curl 成功但业务失败还当成功”。🙂


三、工作流程图(你可以当排障 checklist)

准备 payload(数组) ↓ <span style="color:red">json_encode</span> → 得到 JSON 字符串 ↓ 设置请求头:<span style="color:red">Content-Type: application/json</span> ↓ cURL POST 发送(超时、返回响应) ↓ 检查:curl_exec 是否 false(网络层) ↓ 检查:HTTP 状态码(协议层) ↓ 按 Content-Type 判断是否 json_decode(业务层)

四、原理/参数对照表(把配置变成可控资产)

推荐值作用常见问题
Content-Typeapplication/json; charset=utf-8声明 Body 格式不设置会被当表单解析
CURLOPT_POSTFIELDSJSON 字符串实际请求体传数组会被转成a=1&b=2
Acceptapplication/json期望响应格式响应非 JSON 时解析失败
CONNECTTIMEOUT3~5s连接超时DNS/TLS 卡住拖垮线程
TIMEOUT10~30s总超时无上限会把 PHP-FPM 拖死

你拿去直接用的“结论”

只要做到两件事:
1)json_encode()得到 JSON Body;
2)请求头带上Content-Type: application/json
再配好超时与错误分层(网络/HTTP/业务),这就是一套可在生产稳定跑的写法。🚀

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:46:16

AI赋能个人效能:从工具使用到思维跃迁的进化之路

当AI工具成为职场人的标配&#xff0c;关于“AI是否会取代人类”的争论逐渐平息&#xff0c;取而代之的是更深刻的思考&#xff1a;如何让AI成为个人能力的“放大器”&#xff0c;实现从效率提升到思维升级的跃迁&#xff1f;2025年的实践已经证明&#xff0c;AI的核心价值不在…

作者头像 李华
网站建设 2026/4/18 3:45:20

TensorRT支持哪些主流大模型架构?一文说清

TensorRT支持哪些主流大模型架构&#xff1f;一文说清 在AI推理部署的战场上&#xff0c;一个常被提及的问题是&#xff1a;为什么训练完的模型“跑不快”&#xff1f; 明明在PyTorch里测试效果不错&#xff0c;参数也冻结了&#xff0c;结果一上线就卡顿频发、延迟飙升——尤其…

作者头像 李华
网站建设 2026/4/18 10:07:37

大模型时代下的推理革命——TensorRT全面解读

大模型时代下的推理革命——TensorRT全面解读 在生成式AI席卷全球的今天&#xff0c;大语言模型动辄千亿参数&#xff0c;视觉模型分辨率不断攀升。这些“巨无霸”在训练阶段依赖成百上千张GPU协同作战&#xff0c;但真正走到用户面前时&#xff0c;却必须面对一个残酷现实&…

作者头像 李华
网站建设 2026/4/17 21:11:35

Java毕设项目推荐-基于springboot的音乐周边产品乐器售卖系统设计与实现 基于Springboot框架的乐器电商平台开发【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/18 7:54:42

国际信用卡收款:Visa/MasterCard/PayPal接入

国际信用卡收款&#xff1a;Visa/MasterCard/PayPal接入 在跨境电商、SaaS订阅和数字内容平台加速全球化的今天&#xff0c;用户对支付体验的期待早已超越“能否完成交易”这一基本需求。他们希望用自己熟悉的支付方式——比如一张 Visa 卡、一个 PayPal 账户——在几秒内完成跨…

作者头像 李华