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

寻求PHP代码精简优化技巧:双API调用代码改进建议

PHP两次API调用代码的精简优化方案

针对你这段实现登录拿SessionID再设置数据点的PHP代码,从精简复用、易维护、健壮性三个角度给你几个实用优化技巧:


1. 提取公共CURL逻辑,消除重复代码

两次CURL调用的核心配置(请求方式、请求头、返回设置)完全一致,把这些公共逻辑封装成独立函数,每次调用只传不同的请求参数即可,大幅减少冗余代码。

2. 用数组生成JSON请求体,替代字符串拼接

原来的POST数据是硬编码的字符串,不仅编写麻烦,拼接SessionID还容易出现语法错误。用数组定义参数,再通过json_encode()生成JSON,既直观又能避免手动拼接的失误,后续修改参数也更方便。

3. 增加基础错误处理

小型项目也不能完全忽略异常情况,比如CURL请求失败、JSON解析失败、SessionID获取失败的场景,加简单的判断和日志记录,方便后续排查问题,避免静默失败。

4. 优化变量命名

把模糊的变量名(比如$j)改成有语义的名称(比如$deviceIp),提升代码可读性,后续自己维护或他人接手时能快速理解逻辑。


优化后的完整代码

<?php
function callDeviceApi($deviceIp, $postData) {
    $url = "http://{$deviceIp}/api.cgi";
    $curl = curl_init();
    
    // 公共CURL配置,用curl_setopt_array批量设置更简洁
    curl_setopt_array($curl, [
        CURLOPT_URL => $url,
        CURLOPT_POST => true,
        CURLOPT_HTTPHEADER => ['Accept: application/json', 'Content-Type: application/json'],
        CURLOPT_POSTFIELDS => json_encode($postData),
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FAILONERROR => true // HTTP错误码直接返回false
    ]);
    
    $resp = curl_exec($curl);
    $error = curl_error($curl);
    curl_close($curl);
    
    // 处理CURL请求错误
    if ($error) {
        error_log("API请求失败: {$error}");
        return false;
    }
    
    // 解析JSON并校验结果
    $result = json_decode($resp);
    if (json_last_error() !== JSON_ERROR_NONE) {
        error_log("JSON解析失败: " . json_last_error_msg());
        return false;
    }
    
    return $result;
}

function turnoff($deviceIp) {
    // 1. 登录获取SessionID
    $loginResp = callDeviceApi($deviceIp, [
        'command' => 'login',
        'data' => [
            'username' => 'admin',
            'password' => 'admin'
        ]
    ]);
    
    if (!$loginResp || empty($loginResp->data->id->sessionID)) {
        error_log("登录失败或未获取到SessionID");
        return;
    }
    $sessionID = $loginResp->data->id->sessionID;
    
    // 2. 设置数据点值
    $setResp = callDeviceApi($deviceIp, [
        'command' => 'setdatapointvalue',
        'data' => [
            'sessionID' => $sessionID,
            'uid' => 1,
            'value' => 1
        ]
    ]);
    
    // 可选:验证设置结果
    if (!$setResp) {
        error_log("设置数据点失败");
    }
}

turnoff('10.0.0.60');
?>

内容的提问来源于stack exchange,提问作者RodneyJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 21:52:57