尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PHP用CURL发送POST请求:从基础到实战的完整指南

PHP用CURL发送POST请求:从基础到实战的完整指南 干PHP开发的谁还没对接过几个API接口就说我自己这些年接过的接口五花八门支付回调、短信发送、物流查询、大模型对话……每次接手新项目第一件事就是确认对方接口文档要求PHP这边用哪种方式请求。时间长了你会发现PHP发POST请求跑不掉的方案就是CURL扩展。哪怕现在有Guzzle这类封装库底层也还是CURL。把这套东西吃透你在API对接这条路上基本就通了一半。这篇分享就把PHP用CURL发送POST请求这件事掰开揉碎讲清楚从最基础的五步写法到请求头设置、JSON数据提交、超时配置、SSL证书处理再到我实际对接过程中踩过的各种坑。不管你是刚入门PHP的小白还是已经写过不少接口的老手只要涉及API对接这篇内容都能直接用得上。1. 先把需求和场景理清楚CURL是什么为什么POST请求离不开它1.1 这是什么东西能解决什么问题CURL全称是Client URL是一个利用URL语法在命令行和代码中传输数据的工具库。PHP的CURL扩展就是PHP对libcurl库的封装让你在PHP代码里能够模拟浏览器、模拟命令行工具向服务器发送HTTP请求并接收响应。在实际开发里CURL干的事太多了。我就拿最常见的场景举例子你的网页想调用一个第三方天气接口前端JS可以直接用AJAX发请求但服务器端PHP要拉取数据怎么办答案就是CURL。PHP的file_get_contents虽然也能发起请求但遇到需要自定义请求头、需要设置超时、需要处理HTTPS证书的场景就非常吃力了。而CURL从一开始就是为这种复杂请求场景设计的。特别是在对接RESTful API的时候POST请求的使用频率极高。创建订单要POST、提交表单要POST、调用大模型对话接口要POST、获取Token通常也是POST。可以说CURL发送POST请求是PHP后端开发的一项基本功属于那种你早晚都要掌握的能力。1.2 环境准备确认扩展可用再开始写代码在使用CURL之前先确认你的PHP环境里已经装好了curl扩展。这个检查非常简单两种办法任选其一php -m | grep curl或者直接写一个PHP文件跑一下phpinfo()搜索curl关键字。如果看到curl support为enabled说明扩展已经激活。如果没装也不复杂。使用宝塔面板的话在PHP管理页面里直接勾选curl扩展然后重启PHP-FPM即可。使用apt源或yum源的服务器可以执行# Debian/Ubuntu系 sudo apt-get install php-curl # CentOS/RHEL系 sudo yum install php-curl # 装完务必重启PHP服务 sudo systemctl restart php-fpm这里我提醒一句很多人在本地写好了代码传到服务器后发现请求失败先别怀疑CURL代码写得不对先检查服务器PHP是否安装了curl扩展。我在生产环境排查过好几次问题最后发现都是服务器环境里curl扩展缺失这个低级错误排查起来特别费时间。1.3 这篇分享适合谁来读如果你是PHP初学者刚刚接触接口对接这篇内容能帮你把CURL发POST请求的整个流程走一遍知道每一行代码在干什么如果你已经有了一定的开发经验接下来谈到的请求头设置、JSON与表单数据的区别、SSL证书处理、常见错误码排查这些细节应该能帮你解决不少实际对接中的疑难问题如果你是团队里负责封装公共HTTP请求模块的开发者后半部分的函数封装思路和日志调试技巧可以直接用到你的项目里。一句话总结只要是做PHP服务端开发、需要跟外部系统交换数据的人这套CURL知识都会长期伴随你的工作。2. 核心配置拆解把POST请求的选项一层层剥开2.1 最简POST请求五步走先跑通先别急着看复杂配置我们从一个最简单的POST请求开始。就像学开车先学会打火挂挡CURL发POST请求也有一个基本的五步套路?php // 第一步初始化CURL句柄 $ch curl_init(); // 第二步设置请求的URL curl_setopt($ch, CURLOPT_URL, https://api.example.com/login); // 第三步设置为POST请求 curl_setopt($ch, CURLOPT_POST, true); // 第四步设置POST请求体表单格式 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([ username admin, password 123456 ])); // 第五步设置将响应结果以字符串返回而不是直接输出到页面 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求并获得响应 $response curl_exec($ch); // 释放资源 curl_close($ch); echo $response;这个例子是CURL发POST请求的最小完整单元。你需要记住的是curl_init()会创建一个CURL句柄所有配置都通过curl_setopt来完成curl_exec()负责真正执行请求执行完毕后必须调用curl_close()释放资源。每次执行完都别忘了关闭句柄这是很多人容易忽略的好习惯在长时间运行的服务里尤其重要。2.2 GET和POST的区别参数放哪里是关键说到POST请求就绕不开GET和POST的区别。简单来说GET请求的参数拼在URL后面服务端通过$_GET接收POST请求的参数放在请求体里服务端通过$_POST或者读取php://input接收。什么时候用GET、什么时候用POST我的判断标准很简单只是查询数据、不改变服务器资源状态的用GET涉及创建、修改、提交的操作用POST。比如拉取商品列表用GET创建订单就必须用POST。当然现在的RESTful API还有PUT、DELETE、PATCH这些方法但底层CURL实现逻辑类似只是把CURLOPT_POST换成CURLOPT_CUSTOMREQUEST比如// 发送PUT或DELETE请求 curl_setopt($ch, CURLOPT_CUSTOMREQUEST, PUT);需要注意的是不少开发者习惯在POST请求里也用CURLOPT_POSTFIELDS传数组这在PHP 5.x时代是可以的但现在的CURL扩展对数组的处理是按表单去解析的如果你要提交JSON数据就必须把数据转成字符串传进去。这个坑一会儿详细说。2.3 参数形式的差异表单数据与JSON数据是两码事POST请求的数据格式粗略分就是两大类application/x-www-form-urlencoded表单格式和application/jsonJSON格式。表单格式的数据长这样usernameadminpassword123456在PHP里用http_build_query()可以把数组快速拼成这种格式。这种格式适合对接一些传统表单接口。JSON格式的数据长这样{username:admin,password:123456}在PHP里用json_encode($data)生成。现在绝大多数主流API接口尤其是大模型接口、云服务接口都要求JSON格式。这里的关键点在于CURLOPT_POSTFIELDS传值的类型// 情况1传数组CURL自动按表单格式发送 curl_setopt($ch, CURLOPT_POSTFIELDS, [username admin, password 123456]); // 情况2传字符串原样发送适合JSON curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([username admin, password 123456]));如果你用情况2发送JSON服务端那边一般是用file_get_contents(php://input)来拿数据。而如果你用情况1发表单服务端那边用$_POST就能直接拿到。很多人对接接口出现问题就是在这两种格式上栽了跟头——客户端发的JSON服务端却用$_POST去接收结果什么都拿不到。还有一种常见格式是multipart/form-data主要用于文件上传。使用场景相对特殊这里先不展开但你要知道CURL是支持这种格式的前提是CURLOPT_POSTFIELDS传入一个包含文件路径的数组。2.4 请求头、认证与Content-Type的设置逻辑POST请求除了请求体请求头Header也非常关键。尤其是现在对接API几乎都要在请求头里带上认证信息。最常见的两类认证方式一种是Authorization: Bearer token另一种是Authorization: Apikey key或者自定义的X-Api-Key。不管哪种在CURL里都是通过CURLOPT_HTTPHEADER设置的$headers [ Content-Type: application/json, Authorization: Bearer sk-xxxxxxxxxxx, Accept: application/json, ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);这里有一个细节很多人不清楚如果你把Content-Type: application/json放在请求头里那么CURLOPT_POSTFIELDS就必须传JSON字符串不能传数组。因为CURL看到header里声明了JSON但请求体如果按表单格式编码发送两边就对不上服务端很容易返回格式错误。设置请求头的逻辑还有一种写法是用CURLOPT_HTTPHEADER直接在数组里声明比用curl_setopt逐个设置CURLOPT_USERAGENT、CURLOPT_REFERER更集中、更易维护。我通常在项目里会把所有的头信息统一收集到一个数组里这样后续加版本号、加追踪ID都很方便。2.5 常用选项速查表记住这些就够用了我结合日常项目经验把CURL发送POST请求最常用的选项整理成一张表。这张表建议你收藏写代码的时候随时翻一眼。选项常量作用常用取值CURLOPT_URL设置请求地址完整的URL字符串CURLOPT_POST启用POST请求true/falseCURLOPT_POSTFIELDS设置POST请求体数组或字符串CURLOPT_RETURNTRANSFER响应以字符串返回true/falseCURLOPT_HTTPHEADER设置请求头字符串数组CURLOPT_TIMEOUT总超时时间秒整数建议至少3秒CURLOPT_CONNECTTIMEOUT连接超时时间秒整数建议2-5秒CURLOPT_SSL_VERIFYPEER是否验证SSL证书true/falseCURLOPT_SSL_VERIFYHOST是否校验主机名0/1/2CURLOPT_USERAGENT设置User-Agent字符串CURLOPT_FOLLOWLOCATION是否跟随重定向true/falseCURLOPT_CUSTOMREQUEST自定义请求方法PUT/DELETE/PATCHCURLOPT_MAXREDIRS最大重定向次数整数这里额外说明一下CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT的区别。CURLOPT_CONNECTTIMEOUT只管建立TCP连接的时间CURLOPT_TIMEOUT是整个请求从发起到拿到响应的总时长上限。我在对接第三方接口时一般CURLOPT_CONNECTTIMEOUT设5秒CURLOPT_TIMEOUT根据接口特点设10到30秒。如果接口响应慢可以适当调高总超时但连接超时保持5秒就够了这样至少能快速判断目标服务器是否在线。3. 实战对接一个真实JSON API的完整过程3.1 场景设定做一个大模型对话接口的PHP封装理论讲再多不如来一个能跑起来的例子。我找一个非常典型的场景对接大模型对话API。这类接口现在到处都是接口的要求也很有代表性通常包括请求方式POST请求地址/v1/chat/completions这类路径请求头需要携带Authorization: Bearer 你的API密钥和Content-Type: application/json请求体一组JSON数据包含模型名称、对话消息列表、温度参数等响应JSON格式包含生成的内容、Token用量等我把这个完整代码写出来带注释方便你直接改改URL和参数就能用。3.2 完整代码实现每一个参数都给你讲明白?php /** * 大模型对话接口调用封装示例 */ function chatCompletion(array $messages, string $apiKey): array { // 1. 准备请求参数 $payload [ model gpt-3.5-turbo, // 模型标识按接口文档调整 messages $messages, // 对话消息格式一般是 [[role user, content 你好]] temperature 0.7, // 温度参数控制随机性 max_tokens 2000, // 生成的最大token数 stream false, // 是否流式返回这里先关闭流式 ]; // 2. 初始化CURL $ch curl_init(); // 3. 设置基础选项 curl_setopt($ch, CURLOPT_URL, https://api.example.com/v1/chat/completions); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 4. 设置请求头 curl_setopt($ch, CURLOPT_HTTPHEADER, [ Content-Type: application/json, Authorization: Bearer . $apiKey, Accept: application/json, ]); // 5. 设置超时 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); curl_setopt($ch, CURLOPT_TIMEOUT, 30); // 6. 执行请求 $response curl_exec($ch); // 7. 错误检测 if (curl_errno($ch)) { $errMsg curl_error($ch); curl_close($ch); return [ code 500, error CURL请求失败: . $errMsg, ]; } // 8. 获取HTTP状态码 $httpCode curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 9. 解析响应 $result json_decode($response, true); if ($httpCode ! 200) { return [ code $httpCode, error isset($result[error][message]) ? $result[error][message] : 未知错误, raw $response, ]; } return [ code 200, data $result, ]; }这段代码里有个细节值得专门讲json_encode($payload, JSON_UNESCAPED_UNICODE)。如果你不传第二个参数默认情况下中文会被转成\uXXXX这样的Unicode转义序列。虽然JSON规范允许这种写法服务端也能解析但可读性很差而且有些接口在解析时可能出现意外问题。加上JSON_UNESCAPED_UNICODE之后中文字符能保持原样日志排查也更方便。还有一个细节是curl_getinfo($ch, CURLINFO_HTTP_CODE)的调用时机。注意我是在curl_exec之后、curl_close之前调用curl_getinfo的一旦关闭了CURL句柄再想获取HTTP状态码就拿不到了。很多人遇到过这个坑先curl_close再curl_getinfo结果拿到的永远是0。3.3 响应处理与解析不要直接信任响应内容接口返回后第一步判断HTTP状态码第二步解析JSON。但你千万别以为接口返回200就万事大吉了。现在的API架构里200只代表HTTP层传输成功业务层可能有自己的错误码。比如有些接口的响应结构是{code: 10001, message: 参数错误, data: []}这时候HTTP状态码是200但业务失败。所以我的习惯是解析响应后先看业务层错误码字段再决定是否继续处理。响应解析的时候注意json_decode默认返回对象如果你更习惯用数组操作记得传第二个参数true。另外对接外部接口一定要一层层把错误信息传递到自己的业务层里去不要简单echo整个响应字符串否则线上排错的时候会很痛苦。还有一个关于大模型的特殊场景如果请求体里设置了stream true接口返回的就不是普通JSON而是流式的data: {choices:[{delta:{content:...}}]}这样一段一段的文本。这种场景下普通的三步式请求和解析就失效了你需要用CURLOPT_WRITEFUNCTION逐段处理流数据或者干脆用CURLOPT_RETURNTRANSFER加上CURLOPT_PROTOCOLS做整段缓冲。这块内容比较复杂等你基础玩法熟悉了可以再深入研究。3.4 边界情况超大响应体、Request Entity Too Large、上下文超限实际对接大模型接口时你会遇到一类很头疼的问题请求体太大或者响应体太大。前面热搜词里就提到过一类报错api error: 400 this models maximum context length is 1048576 tokens。这类问题的核心原因是请求里的prompt内容加上已有上下文总token数超过了模型的上限。遇到这种问题CURL这边能做的不多主要还是在业务层做控制。你有几个选择一是对发送内容做裁剪比如只取关键信息作为prompt二是采用分片或摘要机制把历史对话压缩后再提交三是在封装函数里对请求体的字节大小做统计和拦截提前预防。另外当你提交的请求体特别大的时候服务器可能会返回413 Request Entity Too Large或者你的PHP进程直接报内存不足。这类问题又涉及PHP的memory_limit和post_max_size配置这里提醒一下别忘了在PHP配置里确认这些值足够应对你的业务数据。4. 常见问题与排查技巧实录4.1 401/403认证错误先从自己身上找原因对接API最常见的报错就是401 Unauthorized或者403 Forbidden。最近大模型API火起来之后那句unexpected status 401 unauthorized: incorrect api key provided我已经在很多地方看到过了。这种报错的原因其实很简单你提交的API Key不正确或者没有正确传递。排查顺序我建议按这个来第一步确认API Key本身是否正确。去接口平台后台重新复制一遍注意复制时别多复制了空格。第二步确认请求头里的字段名和格式。有些API要求Authorization: Bearer key有些要求X-Api-Key: key还有的用api-key作为字段名。仔细对照接口文档一个字母都不能差。第三步确认密钥是否放在环境变量或配置文件里正确读取。我见过有人把密钥写在代码里结果部署时用错了配置文件导致生产环境一直401。第四步确认密钥是否有权限。有的密钥只开通了某个模型或某类接口的权限调用其他接口也会报403。说句实在话401这类问题90%以上都是前两步造成的。程序员排查问题时要养成一个习惯先看自己的代码再怀疑对方的接口。4.2 返回空内容、CURLE_GOT_NOTHING网络层的诡异问题另一个常见的坑是请求发出去了响应结果却是空字符串或者curl_error返回CURLE_GOT_NOTHING。这个错误码对应的数值是52意思是CURL在传输过程中没有收到任何数据。我一次实际排查中遇到过这种情况本地环境一切正常部署到服务器后同样的代码偶尔返回空内容。后来通过抓包发现服务器和接口服务器之间的TLS握手出了问题。解决方案也很干脆——把CURLOPT_SSL_VERIFYPEER暂时设为false先验证是不是证书校验问题。如果设为false后请求恢复正常那就说明服务器的CA证书库需要更新或者对方网站的证书链有问题。还有一种比较隐蔽的原因目标服务器返回了Expect: 100-continue响应而你的CURL版本或代理设置没能正确处理这个中间响应。这时可以在请求头里显式加一行Expect:值留空告诉服务器不需要100-continue协商$headers [Expect:];4.3 SSL证书报错curl: (60) SSL certificate problem对接HTTPS接口时如果服务器本地的CA证书库不完整或者过旧CURL就会报SSL certificate problem: unable to get local issuer certificate。这里我要说清楚一个原则生产环境一定不要用关闭SSL验证的方式来绕过错即不要设置CURLOPT_SSL_VERIFYPEER, false。这种做法虽然能让代码跑通但等于把数据传输的安全性交给了运气很容易遭受中间人攻击。正确做法是curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_CAINFO, /path/to/cacert.pem);下载一份最新的cacert.pem可从curl官网的CA证书项目获取配置到CURLOPT_CAINFO里这样既保证了安全性又解决了证书校验失败的问题。如果你用的是云服务器也可以直接执行系统命令更新ca-certificates包。4.4 中文乱码与编码问题响应内容怎么转都对不上对接国内接口时很多接口返回的是GBK编码而PHP处理字符串默认是按UTF-8来的于是页面一输出就是满屏乱码。这个问题不算CURL独有但CURL请求返回的内容就是源头。处理方式很直接// 拿到响应之后检测并转换编码 $encoded mb_detect_encoding($response, [UTF-8, GBK, GB2312], true); if ($encoded ! UTF-8) { $response mb_convert_encoding($response, UTF-8, $encoded); }还有一种情况是你发送的数据里有中文接收方返回编码错误。这时候回到json_encode的JSON_UNESCAPED_UNICODE参数确保中文按原样发送同时确认请求头里Content-Type带了charsetutf-8。4.5 超时与并发单个请求没问题批量调用全凉了我们接口对接时常常遇到一个现象单个请求慢但能成功循环批量请求时一堆失败。这里面有两层原因。第一层是CURL句柄复用的问题。如果每次循环都新建句柄请求完就关闭效率很低但如果复用同一个句柄又要小心上一次请求的参数残留。我在循环请求里习惯用curl_reset()来重置句柄然后再重新设置参数。第二层是并发能力的问题。PHP默认是串行执行CURL请求的也就是说你得等上一个请求完成才能发出下一个。如果你需要同时请求多个接口比如批量请求10个不同参数的POST接口直接用curl_multi_*系列函数做并发请求会快很多。这类函数使用起来比单CURL复杂但面试和实际项目中都是加分项。关于超时和并发我的经验是给每个外部请求都设置合理的超时时间并且务必在代码里对超时做兜底处理。别让一个外部接口的异常影响了整个业务链路。4.6 常见错误码速查表看到报错不慌错误码常量名含义常见处理方式0CURLE_OK请求成功无需处理7CURLE_COULDNT_CONNECT连接目标服务器失败检查DNS、端口、防火墙28CURLE_OPERATION_TIMEDOUT操作超时调整CURLOPT_TIMEOUT检查接口性能52CURLE_GOT_NOTHING没有收到任何数据检查SSL/防火墙/100-continue56CURLE_RECV_ERROR接收数据错误多见于SSL_read失败检查TLS版本58CURLE_SSL_CERTPROBLEM本地证书问题更新CA证书库60CURLE_SSL_CACERTCA证书校验失败配置CURLOPT_CAINFO这里我想强调一下错误码56也就是CURLE_RECV_ERROR。热词里也出现过类似curl 56 openssl ssl_read的报错。这个报错通常发生在TLS握手或传输过程中多见于服务器OpenSSL版本过老、与目标服务器TLS版本不兼容或者代理干扰。排查方向主要是升级OpenSSL、检查是否存在中间防火墙、确认目标服务器支持的TLS版本。5. 进阶封装与个人心得5.1 封装一个可复用的curl_post函数实战中我不会每次对接接口都重头写一遍CURL代码。更合理的做法是把CURL发POST请求封装成一个通用函数把URL、请求体、请求头、超时时间作为参数传入把错误检测、状态码获取、响应解析全部内置。这里提供一个我项目里常用的简化版封装?php /** * 通用CURL POST请求封装 */ function curlPost(string $url, array|string $data, array $headers [], int $timeout 10, int $connectTimeout 5): array { $ch curl_init(); // 如果data是数组且没有显式设置JSON header默认走表单格式 $postFields $data; if (is_array($data)) { $postFields http_build_query($data); } $defaultHeaders [Expect:]; if (is_array($data) empty($headers)) { $defaultHeaders[] Content-Type: application/x-www-form-urlencoded; } curl_setopt_array($ch, [ CURLOPT_URL $url, CURLOPT_POST true, CURLOPT_POSTFIELDS $postFields, CURLOPT_RETURNTRANSFER true, CURLOPT_CONNECTTIMEOUT $connectTimeout, CURLOPT_TIMEOUT $timeout, CURLOPT_HTTPHEADER array_merge($defaultHeaders, $headers), CURLOPT_SSL_VERIFYPEER true, CURLOPT_SSL_VERIFYHOST 2, ]); $response curl_exec($ch); $errno curl_errno($ch); $error curl_error($ch); $httpCode curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($errno) { return [code 0, http_code $httpCode, error $error, data ]; } return [code $errno, http_code $httpCode, error $error, data $response]; }使用的时候调用方只需要关心传入URL和数据返回的结构统一携带http_code、error、data三个关键字段方便业务层做分支处理。这里用了curl_setopt_array比一行行curl_setopt更清晰注意curl_setopt_array是PHP 5.1.3起支持的现在随便用没问题。5.2 调试技巧把请求日志记录下来对接外部接口时最容易遇到的问题就是线上环境没有足够的日志出了问题无从下手。我的习惯是在CURL请求的关键节点打日志把请求URL、请求头敏感信息脱敏、请求体、HTTP状态码、CURL错误信息、响应摘要都记录下来。这里特别提醒一个隐私问题日志里绝不能明文记录Authorization密钥。我见过有人调试的时候把完整请求头打到日志文件里结果日志文件泄漏API密钥也一起泄漏了。正确的做法是把密钥字段做脱敏只保留前几位和后几位比如sk-abc****xyz。日志写到哪可以直接用error_log()写到PHP错误日志里也可以自己封装一个简单的文件日志函数。生产环境建议用成熟的日志组件但不管用什么统一格式、包含关键字段是基本要求。5.3 项目管理上的几个建议密钥管理、重试机制、环境隔离做API对接项目除了把请求发出去还要考虑代码的健壮性和可维护性。最后分享几点我这几年的实操体会。第一API密钥和接口地址一定要放配置文件或环境变量里不要直接硬编码在业务代码中。部署到测试环境要有一套测试密钥生产环境要有一套生产密钥通过环境区分自动加载。第二对于不幂等的POST请求重试要特别小心。比如支付回调这种接口不能盲目重试否则容易造成重复扣款。如果接口支持幂等键Idempotency-Key一定要用上。如果接口不支持重试逻辑要配合业务层去重处理。第三第三方接口的稳定性你控制不了但你的代码必须有兜底。接口挂了要能快速感知、快速降级不要影响主流程。可以用监控系统定期探测接口健康状态也可以在业务代码里对第三方请求做降级开关。第四不要随意执行来路不明的curl管道命令。很多开发者在网上看到一段curl xxx | bash的安装脚本就直接在服务器上跑这里面的风险非常大。轻则安装了一堆乱改环境的程序重则被植入挖矿脚本或后门。任何要执行到服务器上的安装命令都要先下载下来看清楚内容再执行。5.4 最后补充一个冷门但好用的小技巧有朋友问过我怎么快速测试一个POST接口通不通不写PHP代码行不行当然行。你完全可以用命令行curl先做验证curl -X POST https://api.example.com/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer sk-xxxxx \ -d {model:gpt-3.5-turbo,messages:[{role:user,content:你好}]}接口文档上的示例参数先用命令行curl跑通确认无误后再用PHP的CURL代码复现。这个流程能帮你把接口本身的问题和PHP代码的问题快速隔离开。很多接口对接问题其实在命令行验证这一步就能发现是接口参数写错了根本不用去调试PHP代码。做API对接几年下来我最大的感受是CURL本身并不难难的是对各种异常情况的处理和整个请求链路的把握。你能把超时、证书、请求头、编码、日志这些细节都处理好对接任何接口都只是换个URL和参数的事。希望这篇分享能帮你在API对接的路上少走一些弯路踩坑时也能更快定位问题。
返回列表