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.mzph.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…