如何在PHP REST WebService中实现接收对象列表(List of Object)作为输入
如何在PHP REST WebService中实现接收对象列表(List of Object)作为输入
嘿,我来帮你搞定这个需求!要接收对象列表作为输入,咱们通常用JSON格式传递数据(这是REST服务的标准做法),然后在PHP里解析这个JSON,转换成PHP的数组/对象来处理。结合你现有的代码,咱们一步步来改:
第一步:限制请求类型并完善路由逻辑
首先,在webApi.php里新增请求方法校验(保存数据用POST更规范),避免其他请求类型访问接口:
<?php require './bootstrap.php'; $uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $uri = explode( '/', $uri ); // 新增:只允许POST请求访问保存接口 if ($_SERVER['REQUEST_METHOD'] !== 'POST') { header("HTTP/1.1 405 Method Not Allowed"); header("Allow: POST"); exit(); } if ((isset($uri[3]) && $uri[3] == 'saveArticoli')) { require './SaveArticoli.php'; $objFeedController = new ArticoliController(); $strMethodName = 'saveArticoli'; $objFeedController->{$strMethodName}(); }else { header("HTTP/1.1 404 Not Found"); exit(); } ?>
第二步:修改saveArticoli方法,解析并处理对象列表
接下来在SaveArticoli.php的方法里,读取请求体的JSON数据,解析后处理每个对象(比如存入数据库):
<?php require '../Connections/connessione.php'; class ArticoliController extends BaseController { public function saveArticoli() { // 1. 读取原始请求体数据 $rawInput = file_get_contents('php://input'); // 2. 解析JSON为PHP关联数组(第二个参数true转成数组,false则是对象) $articoliList = json_decode($rawInput, true); // 3. 验证JSON格式和数据有效性 if (json_last_error() !== JSON_ERROR_NONE) { header("HTTP/1.1 400 Bad Request"); header("Content-Type: application/json"); echo json_encode(['error' => '无效的JSON格式,请检查输入']); exit(); } if (!is_array($articoliList) || empty($articoliList)) { header("HTTP/1.1 400 Bad Request"); header("Content-Type: application/json"); echo json_encode(['error' => '请提供有效的商品对象列表']); exit(); } // 4. 循环处理每个对象(示例:存入数据库) global $conn; // 假设connessione.php已定义数据库连接对象$conn foreach ($articoliList as $articolo) { // 校验单个对象的必填字段(根据你的业务调整) if (!isset($articolo['nome'], $articolo['prezzo'])) { header("HTTP/1.1 400 Bad Request"); header("Content-Type: application/json"); echo json_encode(['error' => '商品信息不完整,缺少名称或价格']); exit(); } // 使用预处理语句防止SQL注入! $stmt = $conn->prepare("INSERT INTO articoli (nome, prezzo, descrizione) VALUES (?, ?, ?)"); $descrizione = $articolo['descrizione'] ?? ''; // 可选字段默认空值 $stmt->bind_param("sds", $articolo['nome'], $articolo['prezzo'], $descrizione); if (!$stmt->execute()) { header("HTTP/1.1 500 Internal Server Error"); header("Content-Type: application/json"); echo json_encode(['error' => '保存商品失败: ' . $stmt->error]); exit(); } $stmt->close(); } // 5. 返回成功响应 header("HTTP/1.1 200 OK"); header("Content-Type: application/json"); echo json_encode([ 'message' => '所有商品保存成功', 'saved_count' => count($articoliList) ]); } } ?>
第三步:前端如何发送请求示例
前端需要用POST请求,设置Content-Type: application/json,把对象列表转成JSON字符串放在请求体里。举个JavaScript的fetch例子:
const articoli = [ { nome: "机械键盘", prezzo: 299, descrizione: "青轴,背光" }, { nome: "电竞耳机", prezzo: 399, descrizione: "7.1声道" } ]; fetch('http://你的域名/webApi.php/saveArticoli', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(articoli) }) .then(res => res.json()) .then(data => console.log(data)) .catch(err => console.error('请求出错:', err));
关键注意事项
- 安全防护:必须用预处理语句操作数据库,避免SQL注入风险。
- 数据校验:一定要检查输入数据的格式和必填字段,防止无效数据流入系统。
- 响应规范:统一返回JSON格式的响应,搭配正确的HTTP状态码(比如400表示请求错误,200表示成功,500表示服务器内部故障),方便前端处理。
备注:内容来源于stack exchange,提问作者bircastri
相关产品推荐
相关产品推荐

