RESTful的优点
优点
1.通过url对资源定位,语义清晰;
2.通过HTTP谓词表示不同的操作,接口自描述;
3.可以对GET、PUT、DELETE请求重试(幂等的);
4.可以对GET请求做缓存;
5.通过HTTP状态码反映服务器端的处理结果,统一错误处理机制;
6.网关等可以分析请求处理结果。
请求重试-是幂等的,失败之后可以多次发起请求
做缓存-降低服务器的压力,响应速度更快
关键不同的状态码处理不同的请求返回
网关-可以检测发起的请求,若500太多的时候就会报错
Q点:
有些浏览器与运营商会在你的响应报文里面加广告
示例restful使用
URL:适合定位,用于资源定位的
QuerySting:灵活,长度限制,通常为URL以外的数据
请求报文体:灵活,长度不限制,不支持GET与DELETE,供PUT、POST提供数据
/Student/火属性/Type/2/ON/6
/Student?Status=火属性&Type=2&ON=6
参考实施指南
1.对于保存、更新类的请求POST、PUT(幂等的)请求,把全部参数都放到请求报文体中;2.对于DELETE请求,要传递的参数就一个资源id,因此把参数放到QueryString中即可;
3.对于GET请求,一般参数的内容都不会太长,因此统一通过QueryString传递参数即可。对于极少数的参数内容超过URL限制的请求,由于GET、PUT请求都是幂等的,因此改查PUT请求把参数通过报文体传参。
/User/5 PATCH //符合rustful风格,但具体使用那个看自己
{"email":"@ab.com","age":"5"}
/User PATCH
{"id":"5","email":"@ab.com","age":"5"}/User/5 DELETE
/User?id=5 QueryString
如何返回错误码
REST:通过HTTP状态码返回服务器端的处理结果
HTTP状态码不适合用于表示业务层面的错误码,它是一个用于表示技术层面的状态码。新增用户的操作中,如果服务器端要求JSON格式,客户端提交XML服务器返回400是没问题的。
但是如果用户名格式错误或者用户名重复,存在2xx与4xx。
400 BadRequest
用户请求的数据格式有问题时:无论成功与失败都返回请求在返回的{"code":"201"}展示具体的错误原因。
400派观点:若前端都没做好校验就返回400,不能通过网关将请求发送到服务器。(google、微信支付)
1.网关等可以监控HTTP状态码,如果接口频繁出现4xx状态码,说明客户端代码不完善。
2.很多系统不同的状态码有不同的含义,如果失败的服务的返回值200违背设计的初衷。
3.有些网关会将返回304的请求重定向到登录页面,若直接返回200将无法跳转
200派观点:网络的问题归网络、业务的问题归业务。(百度、微信小程序)
业务日志:返回200的看code的错误记录在此
技术日志:返回400、500记录在此
技术一个为业务服务
作者的个人观点
1.对于数据库服务器连接失败、请求报文格式、服务器端异常等业务错误,服务器端应返回4xx、5xx。
2.对于业务层面的错误,比如用户不存在,使用4xx等状态码返回。在报文中返回详细错误,{”code“:3,"message":"用户不存在"}。
3.不仅要返回400的HTTP状态码,不要忘了通过响应报文返回详细信息,指出问题出在哪里。
实现建议
使用总结:
[Route("api/[controller]/[action]")]
User/DeleteUser(int id)
出现这个说明该接口不符合swagger的使用规则
接口中调用自定义的方法不能使用public定义只能使用private方法
了解:加上这段就可以使用public的方法了,一般不这么干了解
安照分层的原则, Controller层中一般是调用其他层定义的、所有上面的的代码只作了解。
ControllerBase与Controller
Controller是继承自ControllerBase,在其基础上创建一些与视图有关的类以供使用MVC
也可以不继承任何类,可以方便后面做单元测试。 但不推荐,继承类的需要配置环境。
读取本地文件
[HttpGet]
public async Task<string> Add2()
{string s=await.ReadAllTextAsync("d:/log.log");return s.Substring(0,20);
}
Action方法的同步与异步
1.异步也可以同步
2.异步一般不需要async结尾
3.返回值为普通类型时,值默认序列号为JSON格式
4.IActionResult类型,不包含类型信息,因为swagger无法推断类型,推荐使用ActionResult<T>它支持类型转换。好处可以返回NotFind()
总结:要么使用普通的数据类型要么使用ActionResult<T>
[HttpGet]
public string Add()
{return "yes";
}
//...
[HttpGet]
public ActionResult<IEnumerable<User>> GetUser()
{if(xxx)
{ return NotFound()
}
return OK();
}
请求样式(更新)
//更新
[HttpPost("{id}")]
public async Task<ActionResult<IEnumerable<User>>> GetMag([fromRoute] int id, User m)
{//....
}/updateuser/8
`/updateuser/${id}`
{
"name":"lyy",
"age":18
}
JSON报文体
1.webapi开发模式下、json格式的请求体是主流。
2.只要声明一个模型类和Json请求格式一致即可。
3.可以混用
4.一定要设置请求头中的Content-Type:application/json,而且数据必须是合法的json格式。
util->index
// 引入axios
import axios from 'axios';
import {ElMessage} from "element-plus";// 创建axios实例
const httpService = axios.create({// url前缀-'http:xxx.xxx'// baseURL: process.env.BASE_API, // 需自定义baseURL:'http://localhost:7137/',// 请求超时时间timeout: 3000 // 需自定义
});//添加请求和响应拦截器
// 添加请求拦截器
httpService.interceptors.request.use(function (config) {// 在发送请求之前做些什么config.headers.token=window.sessionStorage.getItem('token');return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});// 添加响应拦截器
httpService.interceptors.response.use( response=> {// 对响应数据做点什么return response;
},function (error) {// 对响应错误做点什么return Promise.reject(error);
});/*网络请求部分*//** get请求* url:请求地址* params:参数* */
export function get(url, params = {}) {return new Promise((resolve, reject) => {httpService({url: url,method: 'get',params: params}).then(response => {resolve(response);}).catch(error => {reject(error);});});
}/** post请求* url:请求地址* params:参数* */
export function post(url, params = {}) {return new Promise((resolve, reject) => {httpService({url: url,method: 'post',data: params}).then(response => {console.log(response)resolve(response);}).catch(error => {console.log(error)reject(error);});});
}/** 文件上传* url:请求地址* params:参数* */
export function fileUpload(url, params = {}) {return new Promise((resolve, reject) => {httpService({url: url,method: 'post',data: params,headers: { 'Content-Type': 'multipart/form-data' }}).then(response => {resolve(response);}).catch(error => {reject(error);});});
}export default {get,post,fileUpload
}
mvc的表单请求,需要请求头中获取数据
前后端分离开发
软件架构的一大主题就是分离,减少耦合
前后端分离技术为了利SEO,去启动”服务器渲染SSR“技术(前端知识)
示例
//用户登录接口[HttpPost]public ActionResult<LoginResult> Login(LoginResult loginReq){if (loginReq.UserName == 'admin' && loginReq.Pwd = "12345"){//数据库获取加载信息 var data=return new LoginResult(true, data);}else return new LoginResult(false, null);}
record的作用?
登录示例
登录成功则返回当前服务器的进程信息
后端页面
//public record LoginRequest(string UserName, string Pwd);
//public record ProcessInfo(long Id,string UserName,long WorkSet);
//public record LoginResponse(bool Ok,string UserName,long WorkSet);
前端页面
相关文章:

RESTful的优点
优点 1.通过url对资源定位,语义清晰; 2.通过HTTP谓词表示不同的操作,接口自描述; 3.可以对GET、PUT、DELETE请求重试(幂等的); 4.可以对GET请求做缓存; 5.通过HTTP状态码反映服务器端…...
网络检测与监控
1.IP sla 服务等级质量检测,思科私有,提供商与用户之间的协议 可以对带宽、延迟、丢包率、网络抖动进行检测 (1)针对icmp进行检测: r1(config)#ip sla 1 r1(config-ip-sla)#icmp-echo 12.12.12.2 source-ip 12.12…...

基于架构的软件开发方法_1.概述和相关概念及术语
1.体系结构的设计方法概述 基于体系结构的软件设计(Architecture-Based Software Design,ABSD)方法。ABSD方法是由体系结构驱动的,即指由构成体系结构的商业、质量和功能需求的组合驱动的。 使用ABSD方法,设计活动可以…...

读所罗门的密码笔记07_共生思想(中)
1. 在人工智能系统中建立信任 1.1. 人类的大脑容易被个人倾向、干扰因素和确认偏误所影响 1.2. 古莱说,然而,从不同的角度去思考事实、花更长时间来做决策的能力,可能会让人类拥有“密探”一般的智慧 1.3. 我们可以对决策进行批判性思考&a…...

目标检测——工业安全生产环境违规使用手机的识别
一、重要性及意义 首先,工业安全生产环境涉及到许多复杂的工艺和设备,这些设备和工艺往往需要高精度的操作和严格的监管。如果员工在生产过程中违规使用手机,不仅可能分散其注意力,降低工作效率,更可能因操作失误导致…...
Linux/Ubuntu/Debian 终端命令:设置文件/目录权限和组
更改文件权限: chmod filename:根据指定的权限更改文件的权限。 例如: chmod ux filename # 为文件所有者添加执行权限 递归更改目录权限: chmod -R <说明> 目录名称:递归更改目录及其内容的权限。 例如…...

QA测试开发工程师面试题满分问答3: python的深拷贝和浅拷贝问题
在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于创建对象副本的两种不同方式。 浅拷贝是创建一个新的对象,该对象与原始对象的内容相同(包括内部嵌套对象的引用)&…...

Spire.PDF for .NET【文档操作】演示:合并 PDF 文件并添加页码
搜索了这么多有关 PDF 合并的信息后,很容易发现,无论您在线合并 PDF 文件还是使用 C#/VB.NET 来实现此任务,您都无法逃避对 PDF 文件安全等一些重要问题的担忧,因此需要花费多少时间或者合并后的文件是否支持打印页码等等。不过&a…...
VMware使用PowerCLI 修改分布式虚拟交换机的默认上联接口为LAG
简介 创建VMware 分布式交换机vDS 并配置 LACP接口时,然后创建新的默认分布式端口组不会默认使用LACP的上联接口。这意味着当创建新的端口组时,不可避免地会导致没手动修改上联端口的问题,导致网络不通,因为它们无可用的上联端口…...

什么是EDM邮件推广营销?
电子邮件作为最古老的互联网沟通工具之一,凭借其无可比拟的直达性、个性化潜力与高投资回报率,始终占据着企业营销策略的核心地位。随着人工智能技术的革新应用,云衔科技以其前瞻视野与深厚技术底蕴,倾力打造了一站式智能EDM邮件营…...

NoSQL之 Redis配置
目录 关系数据库与非关系型数据库 关系型数据库: ●非关系型数据库 关系型数据库和非关系型数据库区别: (1)数据存储方式不同 (2)扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 Redis简介…...
Android U user+root实现方案
背景 由于项目(MTK平台)上要实现userroot的版本,供特殊用户使用。Android T上的方案无效,经历了各种搜索查看资料,和bsp大佬一起通宵奋战,整出了方案。梳理记录下,有需要的同学可以参考。 Root…...

CSS3 Transform变形理解与应用
Transform:对元素进行变形; Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画。但只有两个关键贞。开始,结束。 Animation:对元素某个属…...

语音克隆技术浪潮:探索OpenAI Voice Engine的奇妙之旅
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
将Python程序打包为Windows安装包
本文使用创作助手。 如果你想将Python程序打包为Windows安装包,你可以使用NSIS(Nullsoft Scriptable Install System)工具。NSIS是一个免费的Windows安装包创建工具。 以下是使用NSIS将Python程序打包为Windows安装包的步骤: 首…...
一个基于大数据的派单管理系统
通常需要处理大量的订单数据,并确保这些数据能够在各个相关部门之间高效、准确地传递。这样的系统不仅有助于提高派单效率,还能优化资源配置,减少不必要的浪费。以下是一个包含所需元素的系统设计方案概述: 数据结构 订单号&…...

【单片机 5.3开关检测】
文章目录 前言一、5.3开关检测1.1没按键按下的1.2有按键按下的 二、改进1.改进 三、独立键盘3.1为什么要取反3.2 实用的按键 总结 前言 提示:这里可以添加本文要记录的大概内容: 课程需要: 提示:以下是本篇文章正文内容…...

每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?
汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…...
wpf ContextMenu
ContextMenu上下文菜单 ContextMenu 在 WPF 中是一个非常有用的控件,它提供了一个在用户执行特定操作(如右键点击)时显示的菜单。ContextMenu 可以附加到几乎所有的 WPF 控件上,使得当用户与这些控件互动时,能够提供一…...

增加网站搜索引擎排名的6个准则
怎样提高网站排名首页 在竞争激烈的网络世界中,网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页,意味着更多的曝光和点击率。以下是一些方法,可以帮助您提高网站在搜索引擎中的排名,让其跻身首页…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...