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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 11:08:08