[转] 使用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的最明显效果就是版本控制:而 ...
随机推荐
- 当padding/margin的取值形式为百分比时。。。。。
一个基础却又容易混淆的css知识点:当margin/padding取形式为百分比的值时,无论是left/right,还是top/bottom,都是以父元素的width为参照物的!也许你会说,left/ ...
- 一招让 IOS 自动化化快的飞起
前言 最近在做IOS自动化测试,IOS的Appium环境都配置OK,Demo脚本运行没有问题,多开执行没有问题,IOS安卓统一平台调度集成没有问题,可以进行自动化测试.课时真正执行用例时发现个严重问题 ...
- java获取当前日期的前一天和后一天
/** * 获得指定日期的前一天 * @param specifiedDay * @return * @throws Exception */ public static String getSpec ...
- Android-Nexus5-命令刷机
第一步)需要有有一部Nexus5手机: 第二步)寻找 .tgz 刷机包: 1: 2: 3.进行hammerhead-lmy47d-factory-6c1ad81e.tgz的下载: 4 进行解压: 5. ...
- JVM运行时数据区(二)
4.本地方法栈 本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务. 与Java虚拟机栈一样本地 ...
- Windows 10 IoT Core 17083 for Insider 版本更新
1月26日,微软发布了Windows 10 IoT Core 17083 for Insider版本更新,概括如下: 新特性:1. General bug fixes2. Enabled Flash ...
- 细说SpringDI Setter注入
依赖注入(DI)是一个过程,通过这个过程,对象可以通过构造函数参数,工厂方法的参数或者在构造或返回对象实例后设置的属性来定义它们的依赖关系从工厂方法.然后容器在创建bean时注入这些依赖关系.这个过程 ...
- RestTemplate远程调用POST请求:HTTP 415 Unsupported Media Type
这是本项目的接口 称为client @POST @Path("/{urlcode}") @Consumes(MediaTypes.JSON_UTF_8) @Produces(Med ...
- 使用《JAVA面向对象编程》总结
抽象和封装 现实世界是“面向对象”的,面向对象就是采用“现实模拟” 的方法设计和开发程序. 面向对象设计是目前计算软件开发中最流行的技术.面向对象设计的过程就是抽象的过程. 类是对某一类事物的描述,是 ...
- Kali学习笔记14:SMB扫描、SMTP扫描
SMB(Server Message Block)协议,服务消息块协议. 最开始是用于微软的一种消息传输协议,因为颇受欢迎,现在已经成为跨平台的一种消息传输协议. 同时也是微软历史上出现安全问题最多的 ...