杨中科 ASP.NETCore Rest

什么是Rest

RPC

1、Web API两种风格: 面向过程(RPC) 、面向REST (REST)

2、RPC:“控制器/操作方法“的形式把服务器端的代码当成方法去调用。把HTTP当成传输数据的通道,不关心HTTP谓词。通过QueryString请求报文体给服务器传递数据。状态码。比如/Persons/GetAll、/Persons/GetBvld?id=8./Persons/Update、/Persons/DeleteByld/8

REST

REST: 按照HTTP的语义来使用HTTP协议
1、URL用于资源的定位: /user/888、/user/888/orders)
2、HTTP谓词: GET、POST (新增) 、PUT (整体更新)DELETE、PATCH (局部更新) 等
3、什么是“幂等”,举例? DELETE(删除id=1的数据,多次删除都是一样的)、PUT、GET是幂等的POST不幂等(幂等:执行一次和执行多次的结果是一致的)
4、GET的响应可以被缓存
5、服务器端要通过状态码来反映资源获取的结果: 404、403(没有权限) 、201 (新增成功)

在这里插入图片描述
RPC:业务驱动,自然
REST: 要求开发人员对REST原则更了解、并且有更多的设计能力。

没有绝对的好与坏,根据业务需求选择适合自己的方式。

REST的优缺点

REST的优点

1、通过URL对资源定位,语义更清晰
2、通过HTTP谓词表示不同的操作,接口自描
3、可以对GET、PUT、DELETE请求进行重试
4、可以用GET请求做缓存
5、通过HTTP状态码反映服务器端的处理结果统一错误处理机制。
6、网关等可以分析请求处理结果

REST的缺点

1、真实系统中的资源非常复杂,很难清晰地进行资源的划分,对技术人员的业务和技术水平要求高。
2、不是所有的操作都能简单地对应到确定的HTTP谓词力
3、系统的进化可能会改变幂等性.
4、通过URL进行资源定位不符合中文用户的习惯
5、HTTP状态码个数有限。
6、有些环节会篡改非200响应码的响应报文
7、有的客户端不支持PUT、DELETE请求。

选择

1、REST是学术化的概念,仅供参考。为什么AWS、ES等比较RESTful。为什么阿里、腾讯等很多系统不RESTful?
2、根据公司情况,进行REST的选择和裁剪

Asp.NET Core Restful中如何传递参数

HTTP传递参数的三种方式

URL: 适合定位;长度限制
QueryString: 灵活,长度限制
请求报文体:灵活,长度不限制;不支持GET、Delete

三种方式的不同语义

URL: 资源定位
Querstring URL之外的额外数据
请求报文体: 供PUT、POST提供数据

实施指南

1、完全按照HTTP语义要求高
2、我的建议
1)对于保存、更新类的请求POST、PUT请求,把全部参数都放到请求报
文体中;
在这里插入图片描述

2) 对于DELETE请求,要传递的参数就是一个资源的id,因此把参数放到QueryString中即可

在这里插入图片描述

3) 对于GET请求,一般参数的内容都不会太长,因此统一通过QueryString传递参数就可以。对于极少数参数内容超过URL限制的请求由于GET、PUT请求都是幂等的,因此我们把请求改成通过PUT请求,然后通过报文体来传递参数。

Asp.NET Core如何返回错误码

状态码

1、REST:通过HTTP状态码返回服务器端的处理结果
2、问题

  1. HTTP状态码数量有限
  2. HTTP的状态码并不适合用来表示业务层面的错误码它是一个用来表示技术层面信息的状态码。新增用户的操作中,如果服务器端要求Json格式,客户端提交XML服务器返回400是没问题的。但是如果用户名格式错误或者用户名重复,存在200派和400派

400派观点

1、网关等可以监控HTTP状态码,如果接口频繁出现4xx1状态码,那么就说明客户端的代码不完善。
2、很多的系统都是按照HTTP状态码的不同含义进行设计的。如果失败了服务器端返回的状态码还是200的话这会违背软件设计的初衷。

200派观点

网络的问题归网络、业务的问题归业务。业务错误不应该和技术错误混在一起。把系统日志和业务日志区分开。

大企业也不统一
百度: 200派
谷歌: 400派
同一家公司企业微信和微信小程序: 200派
微信支付: 400派

个人观点:400派
1、对于数据库服务器连接失败、请求报文格式、服务器端异常等非业务错误,服务器端应该返回4xx、5xx等状态招
2、对于业务层面的错误,比如用户不存在,我们要使用4xx等HTTP状态码返回。同样在响应报文体中给出详细的错误信息,比如(“code”:3,message”:”用户不存在”}。
3、不仅要返回4xx的HTTP状态码,而且不要忘了通过响应报文体给出详细的错误信息。对于用户不存在,不仅要404,而且把响应报文体设置为(“code”:3,message”:”用户名已存在”],这样能区分出来是哪里的问题

ASP.NET Core中的Rest落地指南

实现建议

1、使用RPC风格: Users/AddNew、Users/GetAll、Users/DeleteByld。
2、对于可以缓存的操作,使用GET请求,对于幂等的更新操作,使用PUT请求,对于幂等的删除操作,使用DELETE请求,对于其他操作,统一使用POST请求。
3、参数: 保存、更新类的请求使用POST、PUT请求,把全部参数都放到请求报文体中;对于GET和DELETE请求,把参数放到QueryString中。推荐尽量使用URL做资源定位。
4、对于业务错误,服务器端返回合适的4XX状态码,不知道该选择哪个状态码就用400,同时,在报文体中通过code参数提供业务错误码以及错误消息。
5、如果请求的处理执行成功,服务器端返回值为200的Http状态码,如果有需要返回给客户端的数据,则服务器端把这些数据放到响应报文体

实现技术

1、控制器上[Route(“[controller]/[action]”)]
2、强制要求控制器中不同的操作用不同的方法名2
3、把[HttpGet]、[HttpPost]、[HttpDelete]、[HttpPut]等添加到对应的操作方法上。
注意: 如果控制器中存在一个没有添加[HttpGet].[HttpPost]等的public方法,Swagger就会报错,可以用ApiExplorerSettings(lgnoreApi = true)]

在这里插入图片描述
运行结果:
在这里插入图片描述
但是此时这个接口是可以直接调用的
在这里插入图片描述

将方法改为private
在这里插入图片描述
运行结果:
在这里插入图片描述
或者加上特性
在这里插入图片描述
运行结果:
在这里插入图片描述
测试:
在这里插入图片描述
在这里插入图片描述
新建Person类
在这里插入图片描述
在这里插入图片描述
编写控制类
在这里插入图片描述
在这里插入图片描述
[HttpGet]
在这里插入图片描述
在这里插入图片描述
运行:
在这里插入图片描述
GetAll
在这里插入图片描述
getById
在这里插入图片描述

Post addNew在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/599367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

紧跟国际潮流,勇探未知领域

紧跟国际潮流,勇探未知领域 文章目录 紧跟国际潮流,勇探未知领域一、计算产业新面貌二、紧跟AI新潮流1、我国人工智能产业发展表现出明显的集群化趋势2、人工智能产业集群是基于网络空间发展的创新集群三、企业簇群及其产业创新生态四、创新的“极化”和…

解析拼团购-----商业升级拉锯战,如何突破重重突围?

每天五分钟讲解一个商业模式,大家好我是模式策划啊浩。 作为新时代商业营销的宠儿“拼团购”如何能成为商业升级的关键因素呢?随着互联网技术的不断进步,拼团购作为一种新兴的消费形式,正逐渐成为商业领域的新宠。在激烈的商业竞…

【LeetCode】608. 树节点

表:Tree ------------------- | Column Name | Type | ------------------- | id | int | | p_id | int | ------------------- id 是该表中具有唯一值的列。 该表的每行包含树中节点的 id 及其父节点的 id 信息。 给定的结构总是一个有效的树。…

linux cat命令增加文件名功能后修复可能出现的bug

增加显示文件名功能后,需要将输出缓冲区的大小增加FILENAME_MAX1,FILENAME_MAX为当前系统文件名最长时占用的字节数,1为冒号占用的1字节,否则在特殊情况下,会导致输出缓冲区不够用,程序崩溃报段错误。 仅仅…

stm32学习笔记:TIM-输出比较

四部分讲解内容,本文是第二部分 输出比较主要用于PWM波形的控制电机(驱动电机的必要条件) 1、定时器基本定时,定一个时间,然后让定时器每隔一段时间产生一个中断,来实现每隔一个固定时间执行一段程序的目…

存储过程从表中获取数据库名称

---------------业务数据库信息 CREATE TABLE [dbo].[app_erp_datbabase_conf] ( [id] [int] IDENTITY(1,1) NOT NULL, [database_type] [varchar](200) NOT NULL, [database_name] [varchar](200) NOT NULL, [create_time] [datetime] NULL, [modify_t…

linux磁盘管理实验1

1.在安装好的linux系统中新加一块硬盘,将硬盘分成2个主分区,和2个逻辑分区,将其中一个逻辑分区设置成vfat(FAT32)分区,并实现开机自动挂载所有分区。 答:添加一个硬盘为sdb 分成2个主分区&#…

Flink电商实时数仓项目部署上线

Flink实时数仓部署 将common作为一个自定义的依赖部署到maven中使用maven将各个子模块打包可以使用FLink框架进行jar包的提交运行。 StreamPark 一个易于使用的流处理应用开发框架和一站式流处理操作平台和管理流应用。它提供了Flink和Spark编写流的脚手架。 Core:可以使用…

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…

项目整合积木报表-设计页面

项目整合积木报表-设计页面 <template><div><iframe id"dome" :srcsrc ></iframe></div> </template><script>export default {data(){return{src:configSrc.src"/jmreport/view/836138868821839872"}}} </…

ansible搭建和基本使用

客户端搭建 linux 安装Python&#xff08;python2版本&#xff0c;并且必须存在路径/usr/bin/python&#xff09; 安装openssh-server&#xff0c;并且配置允许root远程连接&#xff08;推荐&#xff09;windows Windows Server 2008R2客户端升级至powershell4.0 配置winrm…

SpringBoot 定时任务 + Scheduled 定时任务器

一、 任务描述&#xff1a; 需求 在于把本地 数据 推送到 第三方 平台的数据库&#xff0c;实现T1 增量&#xff1b; 二、实现用到技术 &#xff08;1&#xff09;Scheduled 定时任务器 Spring 3.0 之后&#xff0c;框架自带的定时任务&#xff1b; &#xff08;2&#x…

【C语言】函数

函数是什么&#xff1f; “函数”是我们早些年在学习数学的过程中常见的概念&#xff0c;简单回顾一下&#xff1a;比如下图中&#xff0c;你给函数 f(x)2*x3 一个具体的x,这个函数通过一系列的计算来返回给你一个结果(图示如下)。 这就是数学中函数的基本过程和作用。但是你…

LeetCode-杨辉三角公式

杨辉三角公式 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a225ff66061e4076924e3299b81b98d5.png /*** author wx* description 杨辉三角公式-标准* create 2023/12/26**/ public class Triangle {public static void main(String[] args) {List<List<I…

【智慧零售】东胜物联蓝牙网关硬件解决方案,促进零售门店数字化管理

依托物联网&#xff08;IoT&#xff09;、大数据、人工智能&#xff08;AI&#xff09;等快速发展&#xff0c;数字化和智能化已成为零售企业的核心竞争力。更多的企业通过引入人工智能、大数据等先进技术手段&#xff0c;提高门店运营效率和服务质量。 某连锁咖啡企业牢牢抓住…

C++程序设计兼谈对象模型(侯捷)笔记

C程序设计兼谈对象模型&#xff08;侯捷) 这是C面向对象程序设计的续集笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 主要内容&#xff1a;涉及到模板中的类模板、函数模板、成员模板以及模板模板参数&#xff0c;后面包含对象模型中虚函数调用&…

原生JS和jQuery请求接口

原生JS请求接口 get请求 //步骤一:创建异步对象 var ajax new XMLHttpRequest(); //步骤二:设置请求的url参数,参数一是请求的类型,参数二是请求的url,可以带参数,动态的传递参数starName到服务端 ajax.open(get,getStar.php?starNamename); //步骤三:发送请求 ajax.send()…

SSMBUG汇总

20240103 通用&#xff0c;驼峰命名法&#xff0c;mybatis。 mybatis入门程序中&#xff0c; // 获取对象的顺序为&#xff1a;SqlSessionFactoryBuild-》SqlSessionFactory-》SqlSessionSqlSessionFactoryBuilder sqlSessionFactoryBuilder new SqlSessionFactoryBuilder();I…

vue3-admin-element框架实现动态路由(根据接口返回)

第一步&#xff1a;在src-utils-handleRoutes&#xff0c;修改代码&#xff1a; export function convertRouter(routers) {let array routersrouters []for (let i in array) {for(let s in asyncRoutes){if (array[i].path asyncRoutes[s].path) {routers.push(asyncRout…

Flutter应用中安卓和IOS的一些权限配置

在Flutter应用中&#xff0c;无论是安卓(Android)还是iOS设备&#xff0c;都可能需要向用户请求权限以访问特定的设备功能或用户数据。以下是一些常用的权限&#xff1a; 安卓设备常用权限 android.permission.CAMERA&#xff1a;使用设备的摄像头android.permission.ACCESS_…