You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:56:35