欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

restful api

程序员文章站 2022-04-10 23:46:39
...

restful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。它是一种设计风格而不是标准,只是提供了一组设计原则和约束条件

restful api

restful api

restful api

restful api

例如 设计一个用户注册登录的api

db.php 数据库连接类

<?php
 
class DB{
 
    public $_pdo;  //存放pdo对象
     
    public function __construct(){
     
    try{
     
        $this->_pdo = new PDO('mysql:host=localhost;dbname=test','root','12345678');
         
        $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
         
    }catch(PDOException $e){
     
            exit($e->getMessage());
             
        }
         
    }
     
}
 
?>

users.php 用户类

<?php
 
require_once('db.php'); // 引入数据库连接类
 
class user
 
{
    private $db;  // 存放pdo对象
     
    public function __construct(){
     
        $db = new db();
         
        $this->db = $db->_pdo;
         
    }
     
    // 注册
     
    public function register($username,$password){
     
        $sql = "INSERT INTO `users` (`username`,`password`)VALUES(:username,:password)";
         
        $sm = $this->db->prepare($sql);//预处理
         
        $sm->bindParam(':username',$username);//参数绑定
         
        $sm->bindParam(':password',sha1($password));
         
        if(!$sm->execute()){
         
            throw new Exception("注册失败", 100);
             
        }
         
        // 返回数据
         
        return [
         
            'username'=>$username,
             
            'user_id'=>$this->db->lastInsertId(),
             
        ];
         
    }
     
}
 
?>

rest.php 启动文件

<?php
 
class rest
 
{
    private $user;  // user资源
     
    private $requestUri; // 请求操作
     
    private $requestMethod; // 请求方法
     
    private $requestResource; // 请求资源
     
    private $allowMethod = ['POST','GET','PUT','DELETE'] ;//允许请求的方法
     
    private $allowResource = ['users','articles']; //允许请求的方法
     
    // 状态码
     
    private $statusCode = [
        '200'=>'OK',
        '204'=>'No Content',
        '400'=>'Bad Request',
        '403'=>'Forbidden',
        '404'=>'Not Found',
        '405'=>'Method Not Allow',
        '500'=>'Server internal Error',
    ];
     
    public function __construct(user $user){
     
        $this->user = $user;
         
    }
     
    // 启动方法
     
    public function run(){
     
        try{
         
            $this->setMethod(); //判断请求方法
             
            $this->setResouce();//判断请求资源
             
            // 分发请求
             
            if($this->requestResource=='users'){
             
                $this->sendUsers();
                 
            }
             
        }catch(Exception $e){
         
            $this->json($e->getMessage(),$e->getCode());
             
        };
         
    }
     
    // json输出函数
     
    public function json($message,$code,$data=null){
     
        if($code!==200&&$code>200){
         
            header('HTTP:1.1'.$code.' '.$this->statusCode[$code]);
             
        }
         
        header('content-Type:application/json;charset:utf-8');
         
        if(!empty($message)){
         
            echo json_encode(['message'=>$message,'code'=>$code,'data'=>$data]);
             
        }
         
        die;
         
    }
     
    // 请求方法
     
    public function setMethod(){
     
        $this->requestMethod = $_SERVER['REQUEST_METHOD'];
         
        if(!in_array($this->requestMethod, $this->allowMethod)){
         
            throw new Exception("方法不允许", '405');
             
        }
         
    }
     
    // 请求资源
     
    public function setResouce(){
     
        $path = $_SERVER['PATH_INFO'];
         
        $arr = explode('/', $path);
         
        $this->requestResource = $arr[2];
         
        if(!in_array($this->requestResource, $this->allowResource)){
         
            throw new Exception("资源不存在", '405');
             
        }
         
        if(!empty($arr[3])){
         
            $this->requestUri = $arr[3];
             
        }
    }
     
    // 用户注册与登陆
     
    public function sendUsers(){
     
        if($this->requestUri=='login'){
         
            $this->doLogin();
             
        }elseif($this->requestUri=='register'){
         
            $this->doRegister();
             
        }
         
    }
     
    // 注册
     
    public function doRegister(){
     
        $username = $_POST['username'];
         
        $password = $_POST['password'];
         
        // 参数过滤略
         
        // 注册
         
        $user = $this->user->register($username,$password);
         
        if($user){
         
            $this->json('注册成功',200,$user);
             
        }
         
    }
     
}
 
?>

index.php 入口文件

<?php
 
require_once('user.php');
 
require_once('rest.php');
 
require_once('db.php');
 
$db = new db();
 
$user = new user();
 
$rest = new rest($user);
 
$rest->run();
 
?>

访问数据时

index.html

<!DOCTYPE html>
 
<html>
 
<head>
 
    <meta charset="utf-8">
     
    <title></title>
     
    <script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script>
     
</head>
 
<body>
 
<input id="username" type="text" name="username">
 
<input id="password" type="password" name="password">
 
<button id="btn">post</button>
 
<script type="text/javascript">
     
    $('#btn').click(function(){
     
        $.post('http://servername/v1/users/register',
         
        { 
            'username':$('#username').val(),
         
            'password':$('#password').val(),},function(text){
             
        },'json') //指定返回类型
         
    })
 
</script>
 
</body>
 
</html>

需要将 http://servername/v1/users/register  重写到index.php上

.htaccess

RewriteEngine on
 
RewriteCond %{REQUEST_FILENAME} !f
 
RewriteCond %{REQUEST_FILENAME} !d
 
RewriteRule (.*)$ index.php/$1 [L]

如果使用的是tp或者laravel等框架,可是不用设置,直接使用路由控制

如果使用的是tp或者laravel等框架,可是不用设置,直接使用路由控制