寻求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
相关产品推荐
相关产品推荐

