PHP Guzzle库循环调用单对象API问题求助
解决Guzzle循环提交单个JSON对象到API的问题
我明白你的问题了——目标API只能单次接收单个短信对象,但你存在$_SESSION['hi2']里的是一个包含多个对象的JSON字符串,直接传整个数组肯定不行,而且你之前尝试foreach没成功,大概率是没先把SESSION里的JSON解码成PHP数组。下面给你完整的修正方案:
第一步:修复核心问题——正确解码SESSION数据并循环提交
你的$_SESSION['hi2']存储的是JSON格式的字符串,不是PHP数组,所以首先要把它转成PHP可遍历的数组,再逐个提交每个对象。另外别忘了开启SESSION,否则根本读不到$_SESSION['hi2']!
修改后的guzzle.php代码:
<?php session_start(); // 必须加!否则无法读取SESSION数据 use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Psr7\Request; // 初始化Guzzle客户端 $client = new Client([ 'headers' => ['Content-Type' => 'application/json'] ]); // 解码SESSION中的JSON字符串为PHP数组 $smsItems = json_decode($_SESSION['hi2'], true); // 校验数据格式 if (!is_array($smsItems)) { die('SESSION中的短信数据格式无效'); } // 循环遍历每个短信对象,逐个发送请求 foreach ($smsItems as $index => $sms) { try { // 将单个PHP数组转成JSON字符串作为请求体 $response = $client->post('http://mmm.clinictech.com.hk:91/SMS', [ 'body' => json_encode($sms) ]); // 输出每个请求的结果 echo "第" . ($index+1) . "条短信请求结果:<br>"; echo "状态码:" . var_export($response->getStatusCode(), true) . "<br>"; echo "响应内容:" . var_export($response->getBody()->getContents(), true) . "<br><hr>"; } catch (RequestException $e) { // 捕获请求异常,方便排查错误 echo "第" . ($index+1) . "条短信请求失败:" . $e->getMessage() . "<br>"; if ($e->hasResponse()) { echo "错误响应详情:" . $e->getResponse()->getBody()->getContents() . "<br><hr>"; } } } ?>
第二步:优化HTML提交方式(可选但推荐)
你现在用的是GET跳转,会把请求参数暴露在URL里,建议改成POST表单提交:
<form method="POST" action="guzzle.php"> <button type="submit" name="send">send</button> </form>
同时在guzzle.php开头加上请求方式校验,避免非法访问:
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { die('请通过表单提交请求'); }
关键要点总结
- 数据格式转换:SESSION里的是JSON字符串,必须用
json_decode()转成PHP数组才能遍历;每个请求时再用json_encode()把单个对象转回JSON字符串,符合API的接收要求。 - SESSION开启:一定要在文件开头加
session_start(),否则无法读取SESSION中的数据,这很可能是你之前尝试循环失败的原因之一。 - 异常处理:加上
try-catch可以定位单个请求失败的问题,比如某个手机号格式错误导致API拒绝。
内容的提问来源于stack exchange,提问作者epiphany
相关产品推荐
相关产品推荐

