当前位置: 首页 > 知识库问答 >
问题:

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

农波涛
2024-07-15

一个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挺多的,目测三四十个。会不会影响性能?或者有什么好的方法,本人初学者,不吝赐教。

共有7个答案

叶阳
2024-07-15

把 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');
}
何晗昱
2024-07-15

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

幸阳波
2024-07-15

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

锺离辰沛
2024-07-15

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

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

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

牟慎之
2024-07-15

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

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

孟跃
2024-07-15

瞳孔地震...哥,接口不是这么写...请看:
Restful API 接口规范详解
https://cloud.tencent.com/developer/article/2360813

庾君博
2024-07-15

答案

使用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']);
}

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

 类似资料:
  • 我想尝试将以下两种方法合二为一: 第一个方法构造一个映射,其中键是<code>String</code>,值是<code<ArrayList</code>。 我想尝试添加第二条信息,即简单的错误消息(方法2)。HashMap不够复杂,无法保存这些信息,但我喜欢它只接受唯一值的方式,而且很容易迭代和传递。 任何建议非常感谢:)

  • jsonInterface配置项基于合约的ABI信息生成。 调用: myContract.options.jsonInterface 属性: jsonInterface - Array: 合约的json接口。重新设置该属性将重新生成合约实例的方法和事件。 示例代码: myContract.options.jsonInterface; > [{ "type":"function",

  • 问题内容: 我目前正在寻找其他搜索方法,而不是拥有庞大的SQL查询。我最近看过Elasticsearch,并玩过whoosh(搜索引擎的Python实现)。 您能给出选择理由吗? 问题答案: 作为ElasticSearch的创建者,也许我可以为您提供一些理由,说明我为什么继续并首先创建它:)。 使用纯Lucene具有挑战性。如果要使其真正发挥出色,就需要注意很多事情,而且它是一个库,因此没有分布式

  • 问题内容: 当您将JavaScript代码包装在这样的函数中时: 我注意到,这为许多网页上的我解决了范围界定问题。这种做法叫什么? 问题答案: 该模式称为 自我调用 ( self-invocation) ,一种 自我调用功能 。它可以创建一个闭包,但这是模式的效果(也许是预期的效果),而不是模式本身。

  • 我写了两个方法来查找数组中最小和最大的int,但它们几乎完全相同,所以我觉得应该有一些方法来简化这一点,也许是一种方法? 我不知道如何处理此类问题,所以我很想看到您的回复! 编辑:虽然这个关于如何将算术运算符传递给一个方法的问题和这个关于如何获得Java 8流的最小值和最大值的问题回答了文字编程问题,但我的问题是关于如何处理方法做类似事情的问题,以及一般比较数组的方法。这篇帖子的答案比那些问题的答

  • 问题内容: 随处可见Java 8 lambda。当我向接口添加其他方法时,为什么这会给我一个错误: 在没有第二种方法的情况下可以正常工作:“ public int getID(String name) 问题答案: Java lambda和方法引用只能分配给 功能接口 。从Java SE 8 API中,软件包描述: 每个函数接口都有一个单一的抽象方法,称为该函数接口的函数方法,lambda表达式的参

  • 我有一个字符串数组列表,希望将所有可能的组合存储到另一个集合中。 例如: 重复并不重要。我现在拥有的代码是: 我正在尝试让它递归调用自己,以便它可以存储组合。我可以得到任何关于代码中缺少的位置或哪个部分的帮助吗?

  • 问题内容: 我读这个和这个,结果发现,在课堂上我需要保存到类的引用,当东西在发生类,我们执行由类的接口中定义的方法工具。好吧,我明白了。我以不同的方式使用接口来调用回调: 我发现这种方式更具可读性,更容易理解,但是不确定这是否是不好的做法。因此,我可以随意走这条路吗? 问题答案: 所以我可以随意走这条路吗? 这种方式不是很正确。 您在说的是称为Observer或/ 模式。 简而言之:订户想要从发布