Laravel框架內實現api文檔:markdown轉為html

来源:https://www.cnblogs.com/drunkhero/archive/2019/08/23/11397605.html
-Advertisement-
Play Games

前後端分離的工作模式於今是非常流行了,前後端工作的對接,就離開不了API文檔的輔助。 根據自己以往的工作經歷,以及瞭解的一些資訊,API文檔的建立,無非以下幾種方式: 1. word文檔模板 2. 第三方平臺,類如postman、showdoc等 3. 框架內單獨自定義一套綁定路由的結構,再... ...


前後端分離的工作模式於今是非常流行了,前後端工作的對接,就離開不了API文檔的輔助。

 

根據自己以往的工作經歷,以及瞭解的一些資訊,API文檔的建立,無非以下幾種方式:

1. word文檔模板

2. 第三方平臺,類如postman、showdoc等

3. 框架內單獨自定義一套綁定路由的結構,再解析成html頁面

4. 在框架內每個路由的方法的註釋塊里按照規則寫註釋,再解析生成api文檔

5. 框架內直接編輯markdown文件,再轉換成html頁面

 

根據自己的使用心得,發表一下個人看法。

1.word文檔模板:

這是在第一家公司--富士康科技集團--接觸到的,就是公司準備好了一個API文檔的模板,每個api對應一個表格,在表格裡填上對應的路徑(path),調用方式(method)、請求參數,返回數據結構等信息。對於剛開始新增api是ok的,當時測試工作和後端正好在不同城市,api文檔可以起到很好的溝通作用。但對於後期維護,總要完善了一個介面,就要對應的去word文檔里查找並修改,一旦後端沒有或忘記更新了,隨著時間過著越久,反而後面越容易把自己帶到坑裡去。

 

優點:前期工作少,拿個模板就可以開寫了。

缺點:更新介面不是很方便。

 

2.第三方平臺:

工作經歷中有一家用到,無非就是把api信息錄入到第三方平臺,本人很是反感。尤其是需要像form表單一樣一個個欄位填寫,一個個介面的添加,簡直是作踐後端的時間價值。維護?簡直是更亂,因為第三方平臺需要登錄賬號,每多一小步,人發懶的概率就越大,時間久了,api文檔不同步的概率和範圍就更大更廣。

 

工作中現在我一直用postman測試介面,所以postman是必用的工具。至於用它寫api文檔是否支持又是否方便,本人沒有接觸過,就不發表看法了。

showDoc是編輯markdown方式,對於添加API介面,撰寫體驗還是很不錯的。但介面信息像postman一樣一條條分開的,查找瀏覽不方便,維護一般首先就是要查找,所以維護體驗也感覺很不好。所以以往有的公司,項目涉及到成員多批變遷時,就有那種同一個功能出現幾個不同的api。因為新增介面信息可以避免去瞭解去確認此功能介面之前是否已經撰寫過,人都有惰性,就乾脆直接新增了介面文檔記錄,結果就自然導致同樣介面的文檔記錄有兩三條,文檔就慢慢失去了原本的價值:輔助新員工快速瞭解功能和開展工作。

 

那什麼時候考慮第三方平臺呢?

有的第三方平臺實現了介面功能實時監控及安全防護,就是有受到攻擊或者介面掛掉的情況時,可以給你手機發簡訊通知你。如果你非常需要這個,那你就用吧。

 

優點:前期工作少,有可能帶有介面安全防護和實時監控,避免因為介面掛掉帶來利益損失。

缺點:不僅多了一步登錄操作,而且大多產品設計的頁面體驗不好,不利於快速新增及更新文檔,管理不好的話,容易失去文檔的本身價值。

 

3.自定義綁定路由的結構:

這是我自己起的名字,可能不太準確。

大體實現方式就是,介面寫好了並定好了路由,就在另外一個php文件針對每一條路由用php語言來定義好一個api文檔所需要的信息。

例如如下:

$app->route("user/getlist")
->request(
        array(
            'page' => '1 //第幾頁',
            'page_size' => '10 //每頁數據條數'
        )
    )
    ->method('post')
    ->response(
        array(
            'data' => array(
                'total_count' => '199 //總記錄條數',
                'list' => array(
                    'username' => 'coderzhai //姓名',
                    'gender' => '1 //1-男 2-女'
                )
            )
        )
    )

然後自己再根據上述結構解析出對應數據展示在頁面里。

 

優點:跟後端代碼一起,文檔更新及維護更方便。文檔按功能劃分、按區域劃分、按版本劃分、增加用戶許可權控制等實現比較方便。

缺點:由於以上代碼是用php語言編寫的,一旦遇上哪裡少了括弧或是逗號等php語法錯誤,就會造成文檔頁面無法瀏覽。還需要費時間的去找到問題的所在並及時修複它。介面路由不適宜用resource組合的,因為具體對應增刪查改哪幾個介面不好確定。

 

4.利用方法的註釋塊生成api文檔

這種方式是瞭解apidoc時瞭解到的,就是按照規定的規則在介面方法的註釋塊里備註信息,類如如下:

/**
* @api {get} /user/:id Request User information
* @apiName GetUser
* @apiGroup User
*
* @apiParam {Number} id Users unique ID.
*
* @apiSuccess {String} firstname Firstname of the User.
* @apiSuccess {String} lastname Lastname of the User.
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "firstname": "John",
* "lastname": "Doe"
* }
*
* @apiError UserNotFound The id of the User was not found.
*
* @apiErrorExample Error-Response:
* HTTP/1.1 404 Not Found
* {
* "error": "UserNotFound"
* }
*/

以上是我從網上隨便粘貼的一段,雖說本人寫代碼不是非常潔癖,但這麼一大串的註釋,本人看著就表示不爽,所以沒一點深入瞭解它的欲望。不介意的就自行研究嘍。

 

優點:同後端代碼一起,更新維護距離近在咫尺。

缺點:註釋太大塊了,感覺影響看功能,代碼顯得十分拖沓,影響美觀。

 

 

5.框架內直接編輯markdown文件

這就是我目前最喜歡的方式,也是本文要講解實現的方式。

 

優點:同後端代碼一起,維護方便;markdown格式編寫,文檔撰寫省時;所有介面在一個頁面或幾個劃分好的頁面里,方便瀏覽和查找。

缺點:要做一些前期工作來實現。但現在有了現成的插件和本文的教程支持,缺點就可以忽略不計了。

 

 

以上幾種方式都比較完了,現在我就來實現在Laravel內撰寫Api文檔,支持網頁瀏覽。

 

要實現的功能主要就是把指定的md文件轉換成html。

github上有一個人氣很旺的插件:erusev/parsedown, 地址:php解析markdown為html的插件:erusev/parsedown

 

一般項目涉及PC後臺,我這裡就新增一個路由文件專門來放這些後臺的api。

 

1.安裝erusev/parsedown插件。

編輯composer.json文件,添加代碼如下:

 "require": {
"php": "^7.1.3",
"fideloper/proxy": "^4.0",
"laravel/framework": "5.7.*",
"laravel/tinker": "^1.0",
"erusev/parsedown":"^1.6" //新增的
},

 

項目根目錄下執行composer install進行安裝。在vendor文件夾下可看到erusev文件夾,則代表安裝成功。

 

2.在app/Providers/RouteServiceProvider.php中引入自定義的後臺路由文件。

public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//新增的後臺路由
$this->mapAdminRoutes();
}

protected function mapAdminRoutes()
{
Route::prefix('admin')
// ->middleware('api') //避免篇幅過長,中間件的引入這裡就忽略了
->namespace($this->namespace)
->group(base_path('routes/admin.php'));
}

 

 

3.添加路由,添加控制器,先調試,要可以成功進入控制器方法。

routes問價下新增admin.php文件,裡面加上我們的api文檔路由:

Route::get('/apidoc', 'Admin\ApiDocController@showDoc');  //註意後面是反斜杠\,否則會報錯

laravel框架入口是public/index.php,為了隱藏這個就自定義個本地解析的名稱,編輯apache的httpd-vhosts文件如下:

<VirtualHost *:80>
ServerName testlaravel
DocumentRoot E:/wamp64/www/laravel/public
<Directory "E:/wamp64/www/laravel/public/">
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Allow from all
Header set Access-Control-Allow-Origin *
</Directory>
RewriteEngine On
RewriteCond $1 !^(index\.php|images|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
</VirtualHost>

編輯好後,重啟apache服務。

 

現在來加控制器,laravel可以用artisan命令生成,方便快捷。在項目根目錄執行如下命令:

php artisan make:controller Admin/ApiDocController

接下來編輯controller文件:

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class ApiDocController extends Controller
{
public function showDoc(Request $request){
echo "hello coder";
}
}

瀏覽器輸入http://laraveltest/admin/apidoc,直到出現hello coder後才可以進行後面步驟。

 

4. 使用插件實現markdown轉為html

功能很簡單,就直接上代碼啦。

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Parsedown;

class ApiDocController extends Controller
{
public function __construct(){
$this->markdownParser = new Parsedown();
}

public function showDoc(Request $request){
$fileContent = file_get_contents(storage_path('doc/admin_api.md'));
$htmlContent = $this->convertMarkdownToHtml($fileContent);
$content = $this->convertMarkdownToHtml($htmlContent);
return view('apidoc_admin')->with('content',$content);
}

public function convertMarkdownToHtml($markdown)
{
$convertedHmtl = $this->markdownParser->setBreaksEnabled(true)->text($markdown);
return $convertedHmtl;
}
}

本文推薦的就是用markdown編輯api的方式,md就是markdown文件的尾碼,我現在把這個文件放在storage/doc/admin_api.md處。

為了測試,我暫時在文件里粘貼了一個markdown格式的api:

**簡要描述:** 

- 用戶登錄介面

**請求URL:**
- ` http://xx.com/api/user/login `

**請求方式:**
- POST

**參數:**

|參數名|必選|類型|說明|
|:---- |:---|:----- |----- |
|username |是 |string |用戶名 |
|password |是 |string | 密碼 |


**返回示例**
```
{
"error_code": 0,
"data": {
"uid": "1",
"username": "zhai coder",
"name": "翟碼農",
"groupid": 2 ,
"reg_time": "2019-08-01",
"last_login_time": "0",
}
}
```
**返回參數說明**

|參數名|類型|說明|
|:----- |:-----|----- |
|groupid |int |用戶組id,1:超級管理員;2:普通用戶 |

**備註**

- 更多返回錯誤代碼請看首頁的錯誤代碼描述

最後還需要準備好一個view文件。

我是創建在resources/views文件夾下的,文件名為:apidoc_admin.blade.php。

方便表達我強烈的推薦意願,css樣式我都給大家調好了,大家直接拿去用吧。

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<style>
html, body {
background-color: #fff;
color: #636b6f;
font-family: 'Nunito', sans-serif;
font-weight: 200;
height: 100vh;
margin: 0;
color:#222; }
.container{
width:800px;
margin:10px auto;
padding:20px;
border-left:2px solid silver;
border-right:2px solid silver; }
table th,td{
border:1px solid #ede;
padding:5px 10px; }
pre{
background: #666;
color: white;
padding: 20px 10px;
font-family: yahei;
overflow: auto; }
li code{
font-size: 28px;
color: #4eb4ee;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
{!! $content !!}
</div>
</body>
</html>

 

到這裡,所有工作算是完成了。

在瀏覽器輸入api文檔訪問地址:

http://testlaravel/admin/apidoc

一幅如畫捲般的文檔頁面就出來嘍。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 摘要: React示例教程。 原文: "快速瞭解 React Hooks 原理" 譯者:前端小智 到 React 16.8 目前為止,如果編寫函數組件,然後遇到需要添加狀態的情況,咱們就必須將組件轉換為類組件。 編寫 ,將函數體複製到 方法中,修複縮進,最後添加需要的狀態。 今天,可以使用 Hook ...
  • 原型prototype 我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype 這個屬性對應著一個對象,這個對象就是我們所謂的原型對象 如果函數作為普通函數,調用prototype沒有任何作用 當函數作為普通函數調用時,它所創建的對象中都會有一個隱含的屬性, 指向該構造函數的原型對 ...
  • 一、建造者模式的概念 建造者模式屬於創建型設計模式。 指的是將一個複雜的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。 建造者模式主要解決在軟體系統中,有時候面臨著"一個複雜對象"的創建工作,其通常由各個部分的子對象用一定的演算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨著劇烈的 ...
  • 在解釋“對象的生命周期”前,先來看下麵這個例子: 有一個停車場共50個停車位,假如這個停車場是通過人工來管理停車位的使用情況,管理員有一個計數器,用來計錄當前空閑的停車位有多少個,每當有新的停車位被使用了計數器就減1,而有新的停車位空閑了計數器就加1。 我們可以把這些停車位理解為【資源空間】,可支配 ...
  • 前言 一> 本書目的。 這是一本思想層面的書,主要是向讀者展示,專業程式員是如何面向對象編程的?設計師是如何面向設計編 程的?逐步引導讀者從控制項編程到對象編程再到業務設計。 二>內容結構。 同事跟我說過一句話,所謂門坎,跨過了就是門,跨不過就是坎。在介紹本書內容之前,先帶領大家瞭解一下從拖拉控制項編程 ...
  • 1. SqlSessionFactory 與 SqlSession. 通過前面的章節對於mybatis 的介紹及使用,大家都能體會到SqlSession的重要性了吧, 沒錯,從錶面上來看,咱們都是通過SqlSession去執行sql語句(註意:是從錶面看,實際的待會兒就會講)。那麼咱們就先看看是怎麼 ...
  • <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.d... ...
  • 作為編程語言屆的老大哥,學習JAVA的人數不勝數,在這裡分享一些學習JAVA的技巧以及方法,當然,這些技巧及方法使用範圍包含但不限於JAVA. ① 筆記軟體 印象筆記:多端互通很方便(https://www.yinxiang.com/) 應用場景(只描述編程學慣用的到的部分): eDiary: 一款 ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...