restful api
程序员文章站
2022-04-10 23:46:39
...
restful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。它是一种设计风格而不是标准,只是提供了一组设计原则和约束条件
例如 设计一个用户注册登录的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等框架,可是不用设置,直接使用路由控制
推荐阅读
-
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
-
C#实现谷歌翻译API示例代码
-
PHP开发api接口安全验证的实例讲解
-
PHP本地进行API接口测试的实例
-
C#利用win32 Api 修改本地系统时间、获取硬盘序列号
-
神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性
-
Spring Cloud入门教程之Zuul实现API网关与请求过滤
-
HTML5 window/iframe跨域传递消息 API介绍
-
通过Canvas及File API缩放并上传图片完整示例
-
html5教程调用绘图api画简单的圆形代码分享