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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...