php用这种方法做json接口合适不?

新手上路,请多包涵

一个php文件做前端的接口,这样来请求数据的写法合适吗?
大致就是:我使用了一个Mysql数据库操作框架,然后建立了一个api.php ,前端发起请求,后端返回数据。
我是这样写的
前端给一个自定义的参数名用来发起请求,后端api.php 用if判断前端给的参数名返回什么样的数据。

if($_POST['type'] == 'get_user'){
 echo json_encode(['code'=>200,'data'=>$用户信息]);
}
if($_POST['type'] == 'get_user_list'){
 echo json_encode(['code'=>200,'data'=>$用户列表]);
}
if($_POST['type'] == 'get_order_list'){
 echo json_encode(['code'=>200,'data'=>$订单列表]);
}
if($_POST['type'] == 'get_order_xq'){
 echo json_encode(['code'=>200,'data'=>$订单详情]);
}

这样做合适不,因为if挺多的,目测三四十个。会不会影响性能?或者有什么好的方法,本人初学者,不吝赐教。

阅读 2.3k
avatarAI BotBETA

答案

使用if语句来根据请求类型返回不同的JSON数据在PHP中是一种常见的方法,特别是在简单或小型项目中。然而,当你的接口数量增加时(如你提到的三四十个),这种方法的可维护性会降低,并且可能引发一些性能问题(尽管在大多数现代服务器上,这种影响可能不明显)。

以下是一些建议来改进你的代码:

  1. 使用路由系统
    考虑使用一个路由系统,这样你可以为每个API端点定义一个单独的函数或方法,而不是在单个文件中使用大量的if语句。这可以提高代码的可读性和可维护性。
  2. 使用RESTful原则
    遵循RESTful(表示性状态转移)原则,将你的URL和HTTP方法映射到不同的操作。例如,使用/users来获取用户列表,/users/{id}来获取特定用户的信息,使用GET方法。
  3. 安全性
    始终验证和清理输入数据以防止SQL注入和其他安全漏洞。考虑使用参数化查询或ORM(对象关系映射)库。
  4. 错误处理
    除了返回成功的数据外,还应该处理可能的错误情况,并返回相应的错误代码和消息。
  5. 返回HTTP状态码
    使用适当的HTTP状态码来表示成功(如200)或错误(如404、500等)。你可以通过http_response_code()函数在PHP中设置HTTP状态码。
  6. 使用框架
    考虑使用现有的PHP框架(如Laravel、Symfony、Slim等),这些框架提供了路由、错误处理、安全性以及其他许多有用的功能。
  7. 日志和监控
    实现日志记录和监控机制,以便你可以跟踪和调试问题。
  8. 性能优化
    虽然在这种情况下性能可能不是主要问题,但始终值得注意。确保你的数据库查询是优化的,并使用缓存(如果适用)来减少数据库负载。

示例(使用路由系统)

假设你使用一个简单的路由系统,你的代码可能如下所示:

// 定义路由和对应的处理函数
$routes = [
    'POST /get_user' => function() {
        // 处理获取用户信息的逻辑
        // ...
        echo json_encode(['code' => 200, 'data' => $userInfo]);
    },
    'POST /get_user_list' => function() {
        // 处理获取用户列表的逻辑
        // ...
        echo json_encode(['code' => 200, 'data' => $userList]);
    },
    // ... 其他路由定义 ...
];

// 解析请求并调用相应的处理函数
$requestMethod = $_SERVER['REQUEST_METHOD'];
$requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);

if (isset($routes[$requestMethod . ' ' . $requestUri])) {
    $routes[$requestMethod . ' ' . $requestUri]();
} else {
    // 处理未找到路由的情况
    http_response_code(404);
    echo json_encode(['code' => 404, 'message' => 'Not Found']);
}

请注意,上述示例仅用于说明目的,并未包含完整的错误处理、安全性或其他重要功能。在实际项目中,你需要考虑这些因素。

7 个回答
新手上路,请多包涵

怎么说呢,如果不是生产级别的代码,自己练练手,作为初学者,也没太大问题。

如果是比较重要的代码,那最好好好学习一下路由系统和中间件,了解一下 RESTful,然后规划一下接口。尽可能复用代码,提升维护效率。

问题中的代码本身,大量并列的if应该使用switch提高效率(虽然对现在的服务器来说微乎其微),即便不使用switch,那么在不需要后续步骤时也应该return打断代码的执行。而你这个代码如果第一个if命中,后续的if也都会跑一次,没意义。

关于自定义参数,本质上是你希望使用一种请求规范,例如要求请求地址为/api/{method = get,put,post,delete}/{table}/[list]?querys,然后代理到统一地址(比如/api/index.php),再自行拆解参数。一些中间件和RESTful机制也是相同原理。

最后,后端的输出还是统一封装比较好,便于维护。

没啥毛病吧,if 改成 switch 即可

无关痛痒的小项目这么写是可以的 因为避免大炮打蚊子

把 api.php 作为一个路由器吧。

然后根据不同的 type 分别创建单独的 php 文件,命中后 require 这个文件进来。

api.php
└── actions
    ├── get_user.php
    └── get_user_list.php

<?php

$action = $_POST['type'] ?? '';
$actions = ['get_user', 'get_user_list'];
// 在当前目录下创建 actions 目录,并且把原本的 get_user 的逻辑放到 get_user.php 文件里面
$actionDir = __DIR__ . '/actions/';

if ($action && in_array($action, $actions) && file_exists($actionFile = $actionDir . $action . '.php')) {
    require $actionFile;
} else {
    exit('404 Not Found');
}

小项目或自己做测试,用if...if, if....elseif,switch. ..case做判断,问题也不大。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题