本文转自: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的更多相关文章

  1. flask开发restful api系列(8)-再谈项目结构

    上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...

  2. flask开发restful api

    flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...

  3. 玩转 SpringBoot 2 快速搭建 | RESTful Api 篇

    概述 RESTful 是一种架构风格,任何符合 RESTful 风格的架构,我们都可以称之为 RESTful 架构.我们常说的 RESTful Api 是符合 RESTful 原则和约束的 HTTP ...

  4. Spring Boot入门系列(二十)快速打造Restful API 接口

    spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...

  5. ASP.NET Core Web API 开发-RESTful API实现

    ASP.NET Core Web API 开发-RESTful API实现 REST 介绍: 符合REST设计风格的Web API称为RESTful API. 具象状态传输(英文:Representa ...

  6. 描述怎样通过flask+redis+sqlalchemy等工具,开发restful api

    flask开发restful api系列(8)-再谈项目结构 摘要: 进一步介绍flask的项目结构,使整个项目结构一目了然.阅读全文 posted @ 2016-06-06 13:54 月儿弯弯02 ...

  7. springmvc/springboot开发restful API

    非rest的url写法: 查询 GET /user/query?name=tom 详情 GET /user/getinfo? 创建 POST /user/create?name=tom 修改 POST ...

  8. 使用Spring MVC开发RESTful API

    第3章 使用Spring MVC开发RESTful API Restful简介 第一印象 左侧是传统写法,右侧是RESTful写法 用url描述资源,而不是行为 用http方法描述行为,使用http状 ...

  9. flask开发restful api系列(7)-蓝图与项目结构

    如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...

随机推荐

  1. linux vi如何保存编辑的文件

    按ESC键回到命令模式,输入:w保存即可,或者输入:wq!保存文件并退出. 以下是保存命令: :w   保存文件但不退出vi . :w file 将修改另外保存到file中,不退出vi . :w!   ...

  2. vue数据更新UI不刷新显示解决方案

    vue比较常见的坑就是数据(后台返回)更新了,但是UI界面并没有更新,常见于以下情况: 一.数据为数组时1.通过数组索引修改数组元素例如: 此时UI数据并不会刷新 2.修改数组长度时: 解决方案: 如 ...

  3. Linux 查找文件内容、替换

    有的时候我们经常性的需要在 linux 某一个目录下查找那些文件里包含我们需要查找的字符,那么这个时候就可以使用一些命令来查找,比如说 grep 1.grep 查询 1.1. 主要参数 [option ...

  4. 简析 __init__、__new__、__call__ 方法

    简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...

  5. Eclipse项目里面看源码和文档

    Eclipse项目里面看源码 1.新建项目列表 2.进入struts2-core-2.3.20.jar,双击之后,看不到源码 3.右键struts2-core-2.3.20.jar,选择propert ...

  6. Pi的计算

    百度百科           圆周率用希腊字母 π(读作pài)表示,是一个常数(约等于3.141592654),是代表圆周长和直径的比值.它是一个无理数,即无限不循环小数.在日常生活中,通常都用3. ...

  7. Slot使用

    1.组件中有单个或多个未命名slot标签时,如下:<Child><span style=”color:red;”>hello world</span></Ch ...

  8. 关于isNaN()函数的细节

    根据<JavaScript高级程序设计>的解释,NaN,即非数值(Not a Number),用于表示一个本来要返回数值的操作数未返回数值的情况,例如5/0就会得到NaN. 而因为NaN的 ...

  9. JVM之虚拟机类加载机制

    有兴趣可以先参考前面的几篇JVM总结: JVM自动内存管理机制-Java内存区域(上) JVM自动内存管理机制-Java内存区域(下)     JVM垃圾收集器与内存分配策略(一) 我们知道,在编写一 ...

  10. Android JNI 学习(十):String Operations Api & Other Apis

    一.String Operations(字符串操作) 1. NewString jstring NewString(JNIEnv *env, const jchar *unicodeChars, js ...