Laravel+API 接口

Laravel+API 接口

網課連接:BIlibili.

中文文檔.

1.RestFul Api編碼風格

一、API設計

  1. 修改hosts,C:\Windows\System32\drivers\etc\hosts,增加127.0.0.1 api.lv8.com # Laravel 框架 用這個域名來測試(推薦規范)

  2. 在命令行中使用 php artisan serve --host api.lv8.com

  3. .envconfig/database.php中配置mysql數據庫等服務用的wamp;

    注意這里的 database.php需要配置 prefix屬性

            'mysql' => ['driver' => 'mysql','url' => env('DATABASE_URL'),'host' => env('DB_HOST', '127.0.0.1'),'port' => env('DB_PORT', '3306'),'database' => env('DB_DATABASE', 'forge'),'username' => env('DB_USERNAME', 'forge'),'password' => env('DB_PASSWORD', ''),'unix_socket' => env('DB_SOCKET', ''),'charset' => 'utf8mb4','collation' => 'utf8mb4_unicode_ci','prefix' => 'laravel_',  # 重點'prefix_indexes' => true,'strict' => true,'engine' => null,'options' => extension_loaded('pdo_mysql') ? array_filter([PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),]) : [],],
    
  4. 安裝Postman,測試接口,https://cdn.liyanhui.com/data.json

二、RestFul

  1. RestFul Api 是一種設計風格,推薦的一種規范,有助于統一協同和管理;

  2. 這里提供兩個網址

    RESTful API

    RESTful API 設計指南

    狀態碼使用規范

2.資源控制器和路由

一、資源控制器

  • 創建一個API-Controller
  • php artisan make:controller UserController --api

二、資源路由

  • 創建好 API 資源控制器之后,在route/web.php 配置相關api資源路由;

    Route::apiResourcce('users', 'UserController');

HTTP類型路由URI控制器方法路由命名描述
GETusersindex()users.index獲取數據列表
POSTusersstore()users.store創建頁的接受處理
GETusers/{user}show()users.show獲得一條數據
PUT/PATCHusers/{user}update()users.update從編輯頁中接受處理
DELETEusers/{user}destroy()users.destroy刪除一條數據

PS:可以通過 php artisan route:list 來查看資源路由列表

3.安裝Laravel8.x

  • 使用 composer 創建

    composer create-project --prefer-dist laravel/laravel blog

  • 提前配置好 hosts 文件,然后運行下面命令

    php artisan serve --host www.lv8.com

  • 創建一個API-Controller

    php artisan make:controller UserController --api

    在UserController 中的 index 寫個 return 'index';.

  • 然后再 routes/api.php中引入API-Controller

    use App\Http\Controllers\UserController;Route::apiResourcce('users', UserController::class);
    
  • 檢查一下路由是否有效

    php artisan route:list

現在是可以請求 www.lv8.com:8000/api/users

4.生成標準API

專門創建一個API抽象類,并繼承調用它。

生成標準API

  1. 創建一個抽象類 BaseController 實現一個生成API的方法,讓控制器繼承;

    php artisan make:controller BaseController

    /*** Class BaseController* @package App\Http\Controllers* api 基類*/
    abstract class BaseController extends Controller
    {// 生成api方法protected function create($data, $msg = '', $code = 200){// 返回api結果$result = [// 狀態碼'code' => $code,//自定義信息'msg' => $msg,// 數據返回'data' => $data];return response($result, $code);}
    }
  2. UserController 中繼承上面的抽象類

    class UserController extends BaseController
    {public function index(){return $this->create([1,2,3], '數據獲取成功',200);  // 當前類是 BaseController 的子類,create是繼承后的方法
    }
    

    繼承后直接使用 $this 來調用抽象類的方法

5.數據列表和分頁

數據列表返回

  1. 創建一個 Model/User ,用于數據庫模型處理,用命令生成;

    php artisan make:model api/User

    // 空模型即可
    class User extends Model
    {use HasFactory;
    }
  2. 注意配置數據庫連接,賬號、密碼、數據庫名、前綴等

  3. 使用模型方式調用數據庫鏈接,并返回數據

    // 在 UserController 中
    use App\Models\api\User;public function index()
    {$reslut = User::select('id', 'username', 'email')->get(); // 這里只要了三個字段return $this->create($reslut, '數據獲取成功',200);// 使用 paginate 來進行分頁
    //        return $this->create(User::select('id', 'username', 'email')->paginate(5), '數據獲取成功',200);  // 這里是前五條數據
    //        return $this->create(User::select('id', 'username', 'email')->simplePaginate(5), '數據獲取成功',200);  // 簡潔版
    }
    

    注意:這里就已經連接數據庫了。

    分頁操作:沒有太多需求的話,一般使用簡單形式 simplePaginate.

    測試接口:http://www.lv8.com:8000/api/users?page=2

6.配置404錯誤

首先規范一下錯誤狀態的狀態碼,具體說明如下:

  • 200(OK)-表示已在響應中發出
  • 204(無內容) - 資源有空表示,請求成功,但無數據
  • 301(Moved Permanently) - 資源的URI已被更新
  • 303 (See Other) -其他(如,負載均衡)
  • 304 (not modified) -資源未更改(緩存)
  • 400 (bad request)- 指代壞請求(如,參數錯誤)
  • 404 (not found)- 資源不存在(找不到頁面)
  • 406 (not acceptable)- 服務端不支持所需表示
  • 500 (internal server error)- 通用錯誤響應
  • 503 (Service Unavailable)- 服務端當前無法處理請求

框架已經非常智能的提供了404的處理,只要固定路徑配置 404 錯誤頁即可;

覆蓋掉系統自帶的404resources/views/errors/404.blade.php

<?php
/** API格式* path:resources/views/errors/404.blade.php* */
// 設置 HTTP 狀態碼為 404
http_response_code(404);// 設置響應頭為 JSON 格式
header('Content-Type: application/json');$result = [// 狀態碼'code' => 404,// 自定義信息'msg' => '資源不存在~',// 數據返回, 返回一個空'data' => []
];echo json_encode($result);  // 必須要加 json_encode 格式轉換    

7.單數據處理及錯誤

  • 資源控制器中 show,表示獲取單一數據,傳遞id參數即可

  • 那么,我們在show 方法里構造獲取方式,具體如下:

    位置:UserController.php

    
    public function show($id)
    {// 判斷id 合法if(!is_numeric($id)){return $this->create([], 'id參數錯誤!!!', 400);}// 獲取數據$result = User::select('id', 'username', 'email')->find($id); // 通過id查找// 判斷是否為空if(empty($result)){return $this->create([], '請求成功,但無數據~', 204);} else {return $this->create($result, '數據獲取成功~', 200);}
    }
    

    PS:路由地址為:http://www.lv8.com:8000/api/users/20

注意,需要把 BaseController 中的 return修改一下

class BaseController extends Controller
{// 生成api方法protected function create($data, $msg = '', $code = 200){// 返回api結果$result = [// 狀態碼'code' => $code,// 自定義信息'msg' => $msg,// 數據返回'data' => $data];return response($result);}
}

8.新增數據API處理

  • 新增一條數據,首先要進行驗證,這里找事服務器端的,用驗證器即可
  • 使用Postman來模擬新增時,選擇Body中的form-data(表單),并用POST;

添加數據函數

public function store(Request $request) // post 進入
{// 獲取提交數據$data = $request->all();// 數據驗證,required 不可為空, unique 唯一,$validator = Validator::make($data, ['username' => 'required|unique:users|min:2|max:10', // 2 < length < 10'password' => 'required|min:6', // x > 6]);// 驗證并提示if ($validator->fails()) { // fails 如果發生錯誤
//            return $this->create([], "提交的數據有誤~", 400);return $this->create([], $validator->errors(), 400);  // $validator->errors() 是框架自帶的錯誤提示英文} else {// 寫入數據$addData = User::create($data);// 存在,說明成功了if ($addData) {return $this->create($data, '數據添加成功~', 200);}}return $data;// 數據驗證
//        $validator
}

數據驗證

規則說明示例
required字段必填(非空)'email' => 'required'
nullable允許字段為 null'phone' => 'nullable'
string必須是字符串類型'name' => 'string'
min:value最小長度/值(字符串、數組、數值)'password' => 'min:6'
max:value最大長度/值'username' => 'max:20'
email驗證郵箱格式'email' => 'email'
unique:table數據庫唯一性校驗'username' => 'unique:users'
exists:table值必須存在于數據庫'role' => 'exists:roles,name'
confirmed字段名_confirmation 匹配'password' => 'confirmed'
in:value1,value2值必須在指定列表內'status' => 'in:active,pending'
numeric必須是數字'age' => 'numeric'
date驗證日期格式(如 Y-m-d'birthday' => 'date'
// 用戶名(必填+唯一+長度限制)
'username' => 'required|unique:users|min:2|max:10',// 密碼(必填+最小長度+確認)
'password' => 'required|min:6|confirmed'// 郵箱(必填+格式驗證)
'email' => 'required|email'

? 快捷記憶口訣

  • 必填非空required

  • 數據類型stringnumericinteger

  • 長度控制min/max/size

  • 唯一性unique(數據庫校驗)

  • 格式驗證emailurldate

  • 二次確認confirmed(如密碼確認)

許可賦值 App\Models\api;

<?phpnamespace App\Models\api;use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;class User extends Model
{use HasFactory;// 許可賦值protected $fillable = ['username', 'password','email', 'details'];
}

9.刪除數據API處理

刪除API DELETE

  • API刪除,使用DELETE動詞既可
public function destroy($id)
{// 判斷id 合法if(!is_numeric($id)){return $this->create([], 'id參數錯誤!!!', 400);}// 查找數據,并刪除 find$users = User::find($id);// 刪除的數據不存在if(empty($users)){return $this->create([], '數據不存在~', 400);}// 執行刪除返回if($users->delete()){return $this->create([], '數據刪除成功~', 200);}return $this->create([], '請求成功,刪除失敗~', 200);
}

使用DELETE方式,請求地址:http://www.lv8.com:8000/api/users/20

Controller.

<?phpnamespace App\Http\Controllers;use App\Models\api\client;
use Illuminate\Http\Request;class ClientController extends BaseController
{/*** Display a listing of the resource.** @return \Illuminate\Http\Response*/public function index(){// 獲取全部數據$data = client::select('id', 'email', 'password_hash', 'phone_number', 'first_name', 'last_name')->get();return $this->create($data, 'success', 200);}/*** Store a newly created resource in storage.** @param  \Illuminate\Http\Request  $request* @return \Illuminate\Http\Response*/public function store(Request $request){// 驗證請求數據$validatedData = $request->validate(['email' => 'required|email|unique:clients','password_hash' => 'required','phone_number' => 'required','first_name' => 'required','last_name' => 'required']);// 創建新的客戶端記錄$client = client::create($validatedData);return $this->create($client, 'Client created successfully', 201);}/*** Display the specified resource.** @param  int  $id* @return \Illuminate\Http\Response*/public function show($id){// 單數據處理// 判斷id是否合法if(!is_numeric($id)){return $this->create([], 'id參數錯誤~', 400);}// 獲取數據$reslut = client::select('id', 'email', 'password_hash', 'phone_number', 'first_name', 'last_name')->find($id);// 判斷是否為空if(empty($reslut)){return $this->create([], '請求成功但無數據~', 200);}return $this->create($reslut, 'success', 200);}/*** Update the specified resource in storage.** @param  \Illuminate\Http\Request  $request* @param  int  $id* @return \Illuminate\Http\Response*/public function update(Request $request, $id){// 判斷id是否合法if(!is_numeric($id)){return $this->create([], 'id參數錯誤~', 400);}// 查找要更新的客戶端記錄$client = client::find($id);if (!$client) {return $this->create([], 'Client not found', 404);}// 驗證請求數據$validatedData = $request->validate(['email' => 'email|unique:clients,email,'.$id,'password_hash' => 'sometimes','phone_number' => 'sometimes','first_name' => 'sometimes','last_name' => 'sometimes']);// 更新客戶端記錄$client->update($validatedData);return $this->create($client, 'Client updated successfully', 200);}/*** Remove the specified resource from storage.** @param  int  $id* @return \Illuminate\Http\Response*/public function destroy($id){// 判斷id是否合法if(!is_numeric($id)){return $this->create([], 'id參數錯誤~', 400);}// 查找要刪除的客戶端記錄$client = client::find($id);if (!$client) {return $this->create([], 'Client not found', 404);}// 刪除客戶端記錄$client->delete();return $this->create([], 'Client deleted successfully', 200);}
}

axios,用例

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title><script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script><style type="text/css">* {padding: 0;margin: 0;}table {font-size: 18px;border-collapse: collapse;width: 700px;height: 80px;margin: 0 auto;text-align: center;}th {width: 100px;height: 68px;padding: 8px 12px;background: yellowgreen;}table,th,td {border: 1px solid yellowgreen;}</style>
</head>
<body><h1>表格</h1><table class="table"><tr><th>id</th><th>username</th><th>gender</th><th>email</th><th>price</th></tr></table><script type="text/javascript">const table = document.querySelector(".table>tbody");let data_str = table.innerHTML;axios({method: 'get',url: 'https://cdn.liyanhui.com/data.json',// data: {}}).then((res) => {// data = res.data;res.data.forEach((value) =>{data_str += `<tr><td>${value.id}</td><td>${value.username}</td><td>${value.gender}</td><td>${value.email}</td><td>${value.price}</td></tr>`;})table.innerHTML = data_str;});</script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80942.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80942.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80942.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MIT6.S081-lab7前置

MIT6.S081-lab7前置 這部分包含了設備中斷和鎖的內容 設備中斷 之前系統調用的時候提過 usertrap &#xff0c;而我們的設備中斷&#xff0c;比如計時器中斷也會在這里執行&#xff0c;我們可以看看具體的邏輯&#xff1a; void usertrap(void) {int which_dev 0;if((r_sst…

Linux 下編譯BusyBox

一、linux下編譯 1.拉取busybox源碼 git clone https://github.com/mirror/busybox.git 內容如下 2.配置make&#xff0c;建議在linux下單獨開一個終端執行 進入busybox源碼目錄&#xff0c;使用如下命令 make menuconfig 3.報錯 解決辦法&#xff1a; 安裝ncurses sud…

Element:Cheack多選勾選效果邏輯判斷

效果展示 取消子級勾選&#xff0c;父級的勾選效果 代碼合集 &#xff08;1&#xff09;組件代碼 fromlist.cheackType 類型&#xff0c;permissio表示是權限. fromlist:[{id:1,children:[{...}]},...]傳遞的數據大致結構 <!-- 操作權限 --><template v-if"…

【3DMax腳本MaxScript開發:創建高效模型虛擬體綁定和材質管理系統,從3DMax到Unreal和Unity引擎_系列第一篇】

3ds Max 腳本開發 3ds Max 腳本開發&#xff1a;創建高效模型虛擬體綁定和材質管理系統3ds Max 插件制作背景&#xff1a;設計思路一、場景節點收集與過濾廢話不多說&#xff0c;直接上完整代碼&#xff1a;界面定義與基礎設置界面控件創建狀態變量核心邏輯函數過濾選項改變事件…

【Linux學習筆記】進程替換和自定義shell

【Linux學習筆記】進程替換和自定義shell &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 文章目錄 【Linux學習筆記】進程替換和自定義shell前言一.進程程序替換1.1 替換原理1.2 替換函數1.2.1函數解釋1.2.2命名理解 二.自主…

【辦公類-89-03】20250429AI寫的研討記錄,清除格式,統一格式,名字替換。部分加粗,添加頁眉

背景需求: 檢查自即,需要AI一下院內的五次科研培訓記錄。 本次用了豆包 豆包寫的不錯,也是“水字數”的高手 把每次培訓內容貼到WORD里 把AI資料貼到WORD里,發現問題: 1、字體、段落什么都是不統一的,需要統一改成宋體小四,1.5倍行距 2、十個研討人也要改成真人。就找…

unity Orbbec Femto Bolt接入unity流程記錄 AzureKinectExamples 插件 使用記錄

奧比中光的深度相機Orbbec Femto Bolt是Microsoft的Azure Kinect DK的升級版&#xff0c;根據官網的文檔配置環境遇到了一些問題&#xff0c;記錄一下。 注意&#xff1a; 官網文檔鏈接&#xff1a;Femto Bolt文檔 1、首先連接相機到電腦USB3.0&#xff0c;接通電源&#xf…

聊天室系統:多任務版TCP服務端程序開發詳細代碼解釋

1. 需求 目前我們開發的TCP服務端程序只能服務于一個客戶端&#xff0c;如何開發一個多任務版的TCP服務端程序能夠服務于多個客戶端呢? 完成多任務&#xff0c;可以使用線程&#xff0c;比進程更加節省內存資源。 2. 具體實現步驟 編寫一個TCP服務端程序&#xff0c;循環等…

Python3:裝飾器、生成器與迭代器

Python3&#xff1a;裝飾器、生成器與迭代器 一、&#x1f3ad; 裝飾器&#xff1a;給函數穿上"魔法外衣"裝飾器基本概念為裝飾器添加參數傳遞功能帶參數的裝飾器functools.wraps&#xff1a;保留原函數的元信息實用裝飾器示例1. 計時器裝飾器2. 緩存裝飾器(Memoizat…

SQL命令一:SQL 基礎操作與建表約束

目錄 引言 一、SQL 基礎命令 &#xff08;一&#xff09;數據庫相關操作 &#xff08;二&#xff09;表格相關操作 &#xff08;三&#xff09;MySQL 常用數據類型 二、增刪改查&#xff08;CRUD&#xff09;操作 &#xff08;一&#xff09;增加數據 &#xff08;二&a…

Windows 桌面個性高效組件工具

軟件介紹 Widgets 這款基于 Vue3 構建的開源 Windows 桌面小部件工具超實用。 其多樣化組件庫涵蓋超 20 種&#xff0c;從倒計時、打工進度等實用工具&#xff0c;到抖音熱榜等實時資訊組件應有盡有&#xff0c;各組件獨立運行&#xff0c;滿足多場景需求。 高度自定義布局支持…

PCB入門指南:從電阻到常見電路的全解析

知識點1【電阻】 常見的是 色環電阻和貼片電阻 1、色環電阻 色環電阻&#xff0c;早期是碳膜電阻&#xff0c;精度不是很高&#xff0c;一般是4個色環&#xff0c;紅 橙 黃 綠 藍 紫 灰 白 黑&#xff0c;每個顏色代表一個阻值 后期是金屬膜電阻&#xff0c;5個色環&#x…

論文閱讀的三個步驟

論文閱讀的三個步驟 方法說明鏈接&#xff1a;https://www.academia.edu/4907403/How_to_Read_a_Paper 方法框架如下

Centos 7 ssh連接速度慢(耗時20秒+)

作系統&#xff1a;centos7.9 現象突然間通過 ssh、xshell等客戶端工具連接時&#xff0c;連接速度緩慢&#xff0c;需要耗時20秒左右才能連接上 排查思路&#xff1a; 1. 查看操作系統日志 從系統日志里看到較多的錯誤&#xff0c;這個可能是一個bug &#xff08;現象類似&a…

通過腳本自動檢查項目中全局的中文

現在越來越多的公司在做出海項目&#xff0c;出海項目首先要解決的就是語言國際化的問題&#xff0c;有很多如l18n、l10n的工具可以用&#xff0c;這些工具可以提供解決方案&#xff0c;但是不能約束開發者的開發行為。開發者仍然可能在代碼中存留沒有做過國際化處理的部分&…

軟件分析師-第三遍-章節導圖-13/14

系統設計&#xff0c;按步驟分&#xff1a;概要設計、詳細設計。另一種分類方式&#xff1a;按設計內容和設計方法分。設計內容&#xff1a;處理流程、輸入/輸出原型、人機交互。設計方法&#xff1a;結構化、面向對象、設計模式。 軟件實現&測試&#xff0c;分為實現、測…

通過全局交叉注意力機制和距離感知訓練從多模態數據中識別橋本氏甲狀腺炎|文獻速遞-深度學習醫療AI最新文獻

Title 題目 Hashimoto’s thyroiditis recognition from multi-modal data via globalcross-attention and distance-aware training 通過全局交叉注意力機制和距離感知訓練從多模態數據中識別橋本氏甲狀腺炎 01 文獻速遞介紹 橋本氏甲狀腺炎&#xff08;HT&#xff09;&a…

刀客doc:小紅書商業技術負責人蒼響離職

根據大廠日爆的爆料&#xff0c;小紅書商業化再度迎來高層人事變動&#xff0c;原商業平臺技術負責人蒼響&#xff08;薯名&#xff09;&#xff0c;職級L2&#xff0c;已于本月正式離職&#xff0c;其下屬團隊現由電商業務負責人接管。 根據刀客doc獲得的資料&#xff0c;蒼響…

Manus AI多語言手寫識別技術全解析:從模型架構到實戰部署

簡介 Manus AI作為當前多語言手寫識別領域的領軍技術&#xff0c;其核心創新在于融合三維卷積網絡、動態特征融合引擎和混合解碼系統&#xff0c;實現了對112種語言的98.7%識別準確率和8ms延遲的實時處理能力。本文將深入探討Manus AI的架構設計、特征提取方法、數據預處理策略…

華為云Astro大屏從iotda影子設備抽取數據做設備運行狀態的大屏實施步驟

目錄 背景與意義 1. 準備階段 2. IoTDA 開放影子查詢API 3. Astro輕應用創建連接器 4. Astro大屏設計界面 5. 數據綁定與交互邏輯 6. 發布與測試 小結&#xff08;流程復盤&#xff09; 背景與意義 隨著物聯網技術的快速發展&#xff0c;越來越多的設備接入云端&#x…