[转] 使用slim3快速开发RESTful API
本文转自:https://blog.csdn.net/u011250882/article/details/50101599
版权声明:本文为博主原创文章,转载请注明出处和作者名,尊重别人也是尊重自己 https://blog.csdn.net/u011250882/article/details/50101599
关于slim
在php的框架世界中,除了像symfony、laravel以及zend这样的全栈式的框架之外,还存在着一些微框架,比如基于symfony的silex,基于laravel的lumen,以及这篇博客中要讲到的slim框架,他们不像别的框架那样笨重,而且存在很多的配置项,大多数都是开箱即用,学习周期也很短,看看文档大多在半天内就能掌握它的基本用法。
关于restful
RESTful架构:
(1)每一个URI代表一种资源;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”;
(4)GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
RESTful误区:
(1)URI包含动词;
(2)URI中加入版本号。
注;以上内容出自阮一峰博文:http://www.ruanyifeng.com/blog/2011/09/restful.html
关于restful只有粗浅的理解,后期读完相关书籍之后再做完善。
slim的安装
这里使用composer安装slim,在命令行下运行如下命令即可安装slim框架:
composer require slim/slim "^3.0"
1
如果使用的是apache服务器,创建.htaccess文件,内容如下:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
再创建index.php文件,内容如下:
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;
require 'vendor/autoload.php';
$app = new \Slim\App;
$app->get('/', function (Request $request, Response $response) {
$response->getBody()->write("Hello, world");
return $response;
});
$app->run();
目前的目录结构如下所示:
这时访问http://localhost/slim,即可看到页面上展现出的hello,world。
实战
这里使用这篇文章http://www.codediesel.com/php/create-a-quick-rest-api-using-slim-framework/
中提到的例子来实现一个RESTful API的例子。
创建学生表:
CREATE TABLE IF NOT EXISTS `students` (
`student_id` int(10) NOT NULL auto_increment,
`score` int(10) default '0',
`first_name` varchar(50) default NULL,
`last_name` varchar(50) default NULL,
PRIMARY KEY (`student_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
这里我们手动新增了一条记录:
查
相关代码如下:
$app->get('/score/{id}', function (Request $request, Response $response, $args) {
try
{
$db = getDB();
$sth = $db->prepare("SELECT * FROM students WHERE student_id = :id");
$sth->bindParam(':id', $args['id'], PDO::PARAM_INT);
$sth->execute();
$student = $sth->fetch(PDO::FETCH_ASSOC);
if($student) {
$response = $response->withStatus(200)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 200,
'error' => '',
'datas' => $student
]
));
} else {
$response = $response->withStatus(404)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 404,
'error' => 'student could not be found',
'datas' => $student
]
));
}
return $response;
$db = null;
} catch(PDOException $e) {
$response = $response->withStatus(500)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 500,
'error' => $e->getMessage(),
'datas' => ''
]
));
return $response;
$db = null;
}
});
获取数据库连接的相关代码如下:
function getDB()
{
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "test";
$mysql_conn_string = "mysql:host=$dbhost;dbname=$dbname";
$dbConnection = new PDO($mysql_conn_string, $dbuser, $dbpass);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbConnection;
}
此时通过curl访问http://localhost/slim/score/1,得到:
改
相关代码如下:
$app->put('/score/{id}', function(Request $request, Response $response, $args) {
try
{
$putDatas = $request->getParsedBody();
$db = getDB();
$sth = $db->prepare("UPDATE students SET score = :score WHERE student_id = :id");
$sth->bindParam(':score', $putDatas['score'], PDO::PARAM_INT);
$sth->bindParam(':id', $args['id'], PDO::PARAM_INT);
$ret = $sth->execute();
$response = $response->withStatus(200)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 200,
'error' => '',
'datas' => 'update successfully'
]
)
);
return $response;
$db = null;
} catch(PDOException $e) {
$response = $response->withStatus(500)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 500,
'error' => $e->getMessage(),
'datas' => ''
]
));
return $response;
$db = null;
}
});
此时通过curl访问http://localhost/slim/score/2,得到:
删
相关代码如下:
$app->delete('/score/{id}', function (Request $request, Response $response, $args) {
try
{
$db = getDB();
$sth = $db->prepare("DELETE FROM students WHERE student_id = :id");
$sth->bindParam(':id', $args['id'], PDO::PARAM_INT);
$sth->execute();
$response = $response->withStatus(200)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 200,
'error' => '',
'datas' => 'delete successfully'
]
)
);
return $response;
$db = null;
} catch(PDOException $e) {
$response = $response->withStatus(500)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 500,
'error' => $e->getMessage(),
'datas' => ''
]
));
return $response;
$db = null;
}
});
此时通过curl访问http://localhost/slim/score/2,得到:
- 增
相关代码如下:
$app->post('/score', function(Request $request, Response $response, $args) {
$postDatas = $request->getParsedBody();
try {
$db = getDB();
$sth = $db->prepare("INSERT INTO students (score, first_name, last_name) VALUES (:score, :firstName, :lastName)");
$sth->bindParam(':score', $postDatas['score'], PDO::PARAM_INT);
$sth->bindParam(':firstName', $postDatas['firstName'], PDO::PARAM_STR);
$sth->bindParam(':lastName', $postDatas['lastName'], PDO::PARAM_STR);
$sth->execute();
$response = $response->withStatus(200)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 200,
'error' => '',
'datas' => 'insert successfully'
]
)
);
return $response;
$db = null;
} catch(PDOException $e) {
$response = $response->withStatus(500)->withHeader('Content-type', 'application/json');
$response->getBody()->write(json_encode(
[
'status' => 500,
'error' => $e->getMessage(),
'datas' => ''
]
));
return $response;
$db = null;
}
});
此时通过curl访问http://localhost/slim/score,得到:
注:这篇博文只是做一个入门案例,示例代码有很多坏味道和不规范的地方。
---------------------
作者:dongxie548
来源:CSDN
原文:https://blog.csdn.net/u011250882/article/details/50101599
版权声明:本文为博主原创文章,转载请附上博文链接!
[转] 使用slim3快速开发RESTful API的更多相关文章
- flask开发restful api系列(8)-再谈项目结构
上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...
- flask开发restful api
flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...
- 玩转 SpringBoot 2 快速搭建 | RESTful Api 篇
概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...
- Spring Boot入门系列(二十)快速打造Restful API 接口
spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...
- ASP.NET Core Web API 开发-RESTful API实现
ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...
- 描述怎样通过flask+redis+sqlalchemy等工具,开发restful api
flask开发restful api系列(8)-再谈项目结构 摘要: 进一步介绍flask的项目结构,使整个项目结构一目了然.阅读全文 posted @ 2016-06-06 13:54 月儿弯弯02 ...
- springmvc/springboot开发restful API
非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...
- 使用Spring MVC开发RESTful API
第3章 使用Spring MVC开发RESTful API Restful简介 第一印象 左侧是传统写法,右侧是RESTful写法 用url描述资源,而不是行为 用http方法描述行为,使用http状 ...
- flask开发restful api系列(7)-蓝图与项目结构
如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...
随机推荐
- js获取复选框值
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- MFC对话框和属性表
对话框主要有两类,分为模式和无模式,它们的功能都被封装在了CDialog中.与对话框相近的是属性表,属性表实际上是具有制表页(TAB 页)的对话框,将对话框中控件更好的组织在一起.借助Cpropert ...
- EmguCV使用Stitcher类来拼接图像
using System; using System.Windows; using System.Collections.Generic; using System.ComponentModel; u ...
- 《http权威指南》读书笔记4
概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...
- Kali学习笔记29:默认安装漏洞
文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 默认安装漏洞: 早期Windows默认自动开启很多服务 ...
- 记录python题
def mone_sorted(itera): new_itera = [] while itera: min_value = min(itera) new_itera.append(min_valu ...
- JSP中的作用域
application用于全局变量,可以获取全局的数据.作用范围比session大. JSP常用内置对象总结:out对象:用于客户端输出数据.request对象:用于处理客户端发送的请求的数据信息.r ...
- flash中调用XML遇到的中文显示异常问题
昨天使用flash调用XML文件进行显示时,出现了中文无法显示的问题,记录一下解决方法: 1.字体设置: 一般flash里的动态文本和嵌入文本都是默认的使用Arial字体,这个字体里可能没有中文,所以 ...
- 【spring】aop切面通知,日志处理
1.spring的切面编程 概念原理可以看这里:http://blog.csdn.net/moreevan/article/details/11977115 2.所需要的jar包 maven引入jar ...
- 【ABP框架系列学习】模块系统(4)之插件示例开发
0.引言 上一篇博文主要介绍了ABP模块及插件的相关知识,本章节主要开发一个插件示例来学习如何创建一个插件,并在应用程序中使用.这个命名为FirstABPPlugin的插件主要在指定的时间段内删除审计 ...