PHP与 RESTful风格的swagger结合生成API

原创 2017年07月18日 17:45:55

PHP与 RESTful风格的swagger结合生成API

版权声明:本文为博主原创文章,未经博主允许不得转载。

1. 什么是RESTful风格

1.官方解释:
一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。(好吧!官方就是官方,果然听不懂~)
2.别人靠谱的理解:
是通过具体的URI定位符,找到对应的资源,然后以固定的格式返回数据,这样的才是Restful API;
3.我的理解:
既然叫风格,所见及风格。通过不同颜色区分不同的url请求,并通过URL定位去请求后台对应的资源并返回相应的数据格式。

2.为什么用RESTful风格开发接口呢

1.无状态,这点非常重要。在调用一个接口(访问、操作资源)的时候,可以不用考虑上下文,不用考虑当前状态,极大的降低了复杂度。(这句话感觉很经典,直接引用知乎上的这句)。
2.每一个URI代表一种资源,就像面向对象语言一切都是对象一样,RESTful API一切都是资源。通过请求某一个url就能获取到你想要的东西。
3.所见即所得,很美观(自认为,嘿嘿);

3.为什么选择SWAGGER

1.我之前也用过其他的接口文档,综合来说,跟swagger相比,页面就是丑。你让追求美感的前端攻城狮怎么用。so chose swagger。
哈哈,在下边

支持API自动生成同步的在线文档
这些文档可用于项目内部API审核
方便测试人员了解API
这些文档可作为客户产品文档的一部分进行发布
支持API规范生成代码,生成的客户端和服务器端骨架代码可以加速开发和测试速度

跟其他API文档工具相比,Swagger各有优缺点,但它功能最多、也是最流行的。

4.废话少说,看效果

这里写图片描述
怎么样,就是好看。
扯了这么多,下边开始搭建环境。我用thinkphp5给大家搭建一个测试案例,会一步一步从头开始。

5.测试案例

第一步
请大家先将TP5框架搭建完成,这个自己上TP官网上自己搞。
第二部
从swagger官网或者github上下载两个文件swagger-ui,swagger-php,将这两个文件整合到TP5框架里,效果如如下:
这里写图片描述
直接扔到根目录下就可以。
第三部
修改swagger-ui下dist下index.html里边的url,需要指向你的代码经过swagger-php转化成json后所存放的文件。我的代码经过转化后放在了swagger-php下的docs文件夹下的swagger.json文件里了。swagger.json也是随便起的名字,只要存放的是json文件就行。
1.swagger-php的作用就是将固定格式的php代码转化生成swagger-ui能够读懂的json文件。
2.所有的接口文件都要转化成swagger-ui能够读取的json形式才能够生成好看的接口文档。(你有一万个接口,都会生成json文件存放到这个swagger.json文件里)。
这里写图片描述
这个json文件swagger-ui才能读取,并生成好看的界面。
到这一步,你还无法生成json文件,需要一个入口文件。这个入口文件就在swagger-php的demo里。
这里写图片描述
将这个入口文件稍加改造
这里写图片描述
我在下边新创建了一个模块,你们用自带的index都行,然后我又创建了一个文件夹,然后给这个入口文件改了一个名字,叫compile_enter.php(编译入口),其实直接把他扔进模块文件夹里就行,不用这么麻烦,只要扫描该模块下有这个入口文件就行,主要怕看着乱。host改成你的域名,basepath拼接上访问路径/public/模块名

<?php

/**
 * @SWG\Swagger(
 *     schemes={"http"},
 *     host="www.pretty.com:80",
 *     basePath="/public/prettyinterface",
 *     @SWG\Info(
 *         version="1.0.0",
 *         title="Swagger Petstore",
 *         description="This is a sample server Petstore server.  You can find out more about Swagger at <a href=""http://swagger.io"">http://swagger.io</a> or on irc.freenode.net, #swagger.  For this sample, you can use the api key ""special-key"" to test the authorization filters",
 *         termsOfService="http://helloreverb.com/terms/",
 *         @SWG\Contact(
 *             email="apiteam@wordnik.com"
 *         ),
 *         @SWG\License(
 *             name="Apache 2.0",
 *             url="http://www.apache.org/licenses/LICENSE-2.0.html"
 *         )
 *     ),
 *     @SWG\ExternalDocumentation(
 *         description="Pretty",
 *         url="http://swagger.io"
 *     )
 * )
 */

prettyinterface这是我的模块名。
下边打开cmd命令窗口,进行json文件的编译转换
这里写图片描述
这个命令分为四个部分,php告诉程序这是用php执行并解析的命令。第二个命令:告诉让swagger-php\bin\swagger来执行解析命令。第三个命令:告诉swagger-php你要扫描的目录,只要入口文件在这个目录下就行。最后一个命令:告诉swagger-php你解析完的命令(就是json文件)写入到哪里。这里生成的json文件也是swagger-ui将要读取并生成页面的json。
好了我这里已经生成了两个接口cmd里也能看到。
这里写图片描述
当然你生成的是什么也没有,因为你什么也没有写。但是界面能够展示出来了。

第四部
你将自己的接口文件写在模块的Controller下即可,就是TP框架怎么写你就怎么写,但是······注释必须要按照swagger的规范来。
demo(就是swagger-php文件夹下的)里边也有,你也可以看 。规范就是规范必须要按照他的规范来写。

<?php
namespace app\prettyinterface\controller;
use think\Db;
/**
        * @SWG\Tag(
        *   name="Search",
        *   description="标签搜索展示套装列表"
        * )  
        */
class SearchController extends FatherController
{

        /**
        * @SWG\Post(
        *  path="/Search_Controller/CoordinatesList",
*  summary="标签搜索套装列表",
*  tags={"Search"},
*  description="<strong>没有条件默认展示每页10条推荐商品。有条件默认展示10件商品。[id:主键],[coordinates_id:唯一标识],[image:列表图片],[price:售价],[comment_count:评价数],[good_comment:好评率],[tag_names:套装标签],[up:点赞数],[down:踩数],[recommend:是否推荐0不推荐1推荐]</strong>",
*  consumes={ "application/x-www-form-urlencoded"},
*  produces={ "application/json"},
*  operationId="SearchCoordinatesListPost",
     *     @SWG\Parameter(
     *         name="search",
     *         in="formData",
     *         description="标签集合(1,1&2&3)",
     *         required=false,
          *   type="string",
     *         collectionFormat="csv"
     *     ),
     *     @SWG\Parameter(
     *         name="page",
     *         in="formData",
     *         description="当前页码(默认为1)",
     *         required=false,
          *   type="integer",
     *         collectionFormat="csv"
     *     ),
     *     @SWG\Parameter(
     *         name="pages",
     *         in="formData",
     *         description="每页显示数据量(默认为10)",
     *         required=false,
          *   type="integer",
     *         collectionFormat="csv"
     *     ),
     *     @SWG\Response(
     *         response=200,
     *         description="josn格式数据<strong>(0请求成功;>0请求有误;Totle总数据量;Pre_page当前页码;Pages每页数据量)</strong>",
     *         @SWG\Schema(
     *       ref="#/definitions/ApiResponse"
     *     ))
        * )
        */
       public function CoordinatesList()
    {

之前入口文件的host拼上basepath在拼上这里的path正好组成了一个完整的url这样他才能找到你的后台接口。想想也不是很神奇。TP5方法名用驼峰需要加下划线如:Search_Controller。

后注:我这个swagger的介绍也就是比别人详细一些,而且swagger需要写这么麻烦的注释也省事不到哪里去呀~SO,我这还有不需要这么麻烦的注释也能达到相同的效果,就是自己写了正则,将普通注释转换成了这种繁琐的swagger认识的注释
只需写成这样:

<?php
namespace app\prettyinterface\controller;
use think\Db;
/**
 * @desc 标签搜索展示套装列表
 * @author 熊童子
 */
class SearchController extends FatherController
{
    /**
     * @name 标签搜索套装列表
     * @desc 没有条件默认展示每页10条推荐商品。有条件默认展示10件商品。[id:主键],[coordinates_id:唯一标识],[image:列表图片],[price:售价],[comment_count:评价数],[good_comment:好评率],[tag_names:套装标签],[up:点赞数],[down:踩数],[recommend:是否推荐0不推荐1推荐]
     * @method Post
     * @param string search null 标签集合(1,1&2&3)
     * @param integer page null 当前页码(默认为1)
     * @param integer pages null 每页显示数据量(默认为10)
     * @return josn格式数据
     */
    public function CoordinatesList()
    {

这里写图片描述

结果:
这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

maven项目切换jdk版本后的注意事项

1、添加jre环境 右键项目-->properties-->java Build Path-->Libraries-->Add Libraries-->JRE syetem Library-->选择新...

Java开发中的23种设计模式详解

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...

HDFS详解

摘要 HDFS体系结构中有两类节点,一类是NameNode,又叫"元数据节点";另一类是DataNode,又叫"数据节点"。这两类节点分别承担Master和Worker具体任务的执行节点。 ...

Doctype作用?严格模式与混杂模式如何区分?它们有何差异?

一、Doctype作用是什么? 声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该文件的类型。让浏览器解析器知道应该用哪个规范来解析文档。声明必须在 HTML 文档的第一行,这并不是一个...

深入分析:Fragment与Activity交互的几种方式(一,使用Handler)

这里我不再详细介绍那写比较chang gui

序列的获取

获取序列常用方法为range和xrange 两者都可以以一定的步长获取指定区间内的序列 唯一的区别在于range不可作为元素进行赋值,赋值也是记录这个语句或者对象本身,不会作为列表存在 xrange本...

【分享】PPT--你不知道的使用技巧

1、改后缀提取 PPT 图片 如何快速提取 PPT 中多张图片,保存到本地? 很多人有个习惯,做完 PPT 后,就把制作素材都删了,为了节省存储空间。但这有一个坏处,万一以后还要用到这些素材呢,尤其...

数据可视化matplotlib的应用(四)

创建子plot: import random import matplotlib.pyplot as plt from matplotlib import style style.use('five...

IOS 七种手势详解(动图+Demo下载)

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的博客专栏,这个关于IOS SDK的专栏我会持续更新 IOS SDK详解前言: 触摸是交互的核心,而手势...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)