杨中科 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、问题
- HTTP状态码数量有限
- 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
相关文章:
杨中科 ASP.NETCore Rest
什么是Rest RPC 1、Web API两种风格: 面向过程(RPC) 、面向REST (REST) 2、RPC:“控制器/操作方法“的形式把服务器端的代码当成方法去调用。把HTTP当成传输数据的通道,不关心HTTP谓词。通过QueryString请求报文体给服务器传递数据。状态码。比如/Persons/GetAll…...
RTU数据采集终端
在现代工业控制系统中,数据采集是一个至关重要的步骤。RTU(远程终端单元)作为一种常用的数据采集终端设备,不仅可以实现数据的采集和传输,还可以实现现场设备的远程监控和控制。 一、RTU数据采集终端的工作原理 RTU数据采集终端是一种将现场…...
双指针--- 数组元素的目标和
目录 数组元素的目标和思路:暴力做法思路:双指针做法: 代码: 原题链接 数组元素的目标和 给定两个升序排序的有序数组 A 和 B ,以及一个目标值 x 。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j) 。 数据保证有唯…...
你的网站或许不需要前端构建(二)
前一阵,有朋友问我,能否在不进行前端编译构建的情况下,用现代语法开发网站界面。 于是,就有了这篇文章中提到的方案。 写在前面 这篇文章,依旧不想讨论构建或不构建,哪一种方案对开发更友好,…...
flutter 使用adb 同时连接 多个模拟器
MUMU模拟器 MuMu模拟器官网_安卓12模拟器_网易手游模拟器 传统只需要 连接一个 默认命令是 默认端口是7555 adb connect 127.0.0.1:7555 但是需要同时连接调试多个模拟器的时候 就需要连接多个 这里可以使用自带的多开 多开后 使用 1 是对应多开的序号 这样就可以查看对…...
网络四元组
文章目录 网络四元组 今天我们来聊聊 网络四元组 网络四元组 四元组,简单理解就是在 TCP 协议中,去确定一个客户端连接的组成要素,它包括源 IP 地址、目标 IP 地址、源端口号、目标端口号。 正常情况下,我们对于网络通信的认识可…...
[实践总结] 限制正则表达式匹配次数/时间 防止DoS攻击
思路 1、优化正则表达式 2、正则表达式无法优化的话,可以考虑限制匹配次数,或者限制匹配时间 限制 匹配次数 public class CountedCharSequence implements CharSequence {private final CharSequence charSequence;private long count;public Counte…...
ffmpeg 5.0版本调试 ffmpeg 5.01 static版本
ffmpeg 5.0版本调试 写法:ffmpeg -rtsp_transport tcp -re -i rtsp://admin:BYTtest2019192.168.1.2:554/h264/ch1/main/av_stream -q 5 -f mpegts -fflags nobuffer -c:v mpeg1video -an -s 960x540 http://127.0.0.1:12345/demo本地写法 ffmpeg -timeout 5000000…...
应用在游戏机触摸屏中的触摸感应芯片
触屏游戏机的屏幕是由液晶屏和触控层组成的。触控层分为电容式触屏和电阻式触屏两种。电容式触屏是将悬空电极和屏幕玻璃上的电极组成静电场,当人体接近屏幕时,就会改变静电场分布,从而实现触摸的位置探测。而电阻式触屏则是利用玻璃上的两层电极之间通电形成一个电阻值,当手指…...
D-Link DES-108 交换机
D-Link DES-108 交换机 1. 百兆交换机 8 口References D-Link Corporation is a Taiwanese multinational networking equipment manufacturing corporation headquartered in Taipei, Taiwan. Taiwanese:adj. 台湾的 n. 台湾人 headquarter [hedkwɔ:tə]&#…...
VIT用于图像分类 学习笔记(附代码)
论文地址:https://arxiv.org/abs/2010.11929 代码地址:https://github.com/bubbliiiing/classification-pytorch 1.是什么? Vision Transformer(VIT)是一种基于Transformer架构的图像分类模型。它将图像分割成一系列…...
MongoDB Certified Associate Developer 认证考试心得
介绍 前段时间通过了 MongoDB Associate Developer 考试,也记下了一些心得,结果忘记发出来了,现在重新整理下。通过考试后证书是这样的: MongoDB 目前有两个认证证书 1. MongoDB Associate Developer 认证掌握使用MongoDB 来构建现代应用…...
基于Java车间工时管理系统(源码+部署文档)
博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…...
2024.1.5
今天真是狂学了一天的C,什么期末考试,滚tmd(就一门政治,不能影响我c的脚步),今天还是指针,主要是函数指针和函数指针数组,将简单的两位数计算器程序用此方式更加简单的实现了&#x…...
水库大坝安全监测设计与施工经验
随着我国的科技水平不断上升,带动了我国的水电建设向更高层次发展。目前,我国的水电站大坝已有上百座,并且大坝安全检测仪器质量与先进技术不断更新发展,如今水电站大坝数据信息采集与观测资料分析,能够有效提高水库大…...
媒体捕捉-拍照
引言 在项目开发中,从媒体库中选择图片或使用相机拍摄图片是一个极为普遍的需求。通常,我们使用UIImagePickerController来实现单张图片选择或启动相机拍照。整个拍照过程由UIImagePickerController内部实现,无需我们关心细节,只…...
Typora+PicGo+Gitee构建云存储图片
创建Gitee仓库 首先,打开工作台 - Gitee.com,自行注册一个账户 注册完后,新建一个仓库(记得仓库要开源) 然后创建完仓库后,鼠标移动到右上角头像位置,选择设置,并点击ÿ…...
【话题】ChatGPT等大语言模型为什么没有智能2
我们接着上一次的讨论,继续探索大模型的存在的问题。正巧CSDN最近在搞文章活动,我们来看看大模型“幻觉”。当然,本文可能有很多我自己的“幻觉”,欢迎批评指正。如果这么说的话,其实很容易得出一个小结论——大模型如…...
通过大量生物、地球、农业、气象、生态、环境科学领域中案例,一起探索如何优雅地使用大模型吧!
以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…...
slf4j+logback源码加载流程解析
slf4j绑定logback源码解析 Logger log LoggerFactory.getLogger(LogbackDemo.class);如上述代码所示,在项目中通常会这样创建一个Logger对象去打印日志。 然后点进去,会走到LoggerFactory的getILoggerFactory()方法,如下代码所示。 public …...
KVM虚拟机部署K8S重启后/etc/hosts内容丢失
前言 使用KVM开了虚拟机部署K8S,部署完成后重启,节点的pod等信息无法获取到,查看报错初步推测为域名解析失效,查看/etc/hosts后发现安装k8s时添加的内容全部消失 网上搜索一番之后发现了 如果直接修改 /etc/hosts 文件࿰…...
Redis使用场景(五)
Redis实战精讲-13小时彻底学会Redis 1.计数器 可以对 String 进行自增自减运算,从而实现计数器功能。 Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。 2.缓存 将热点数据放到内存中,设置内存的最大使用量以及淘汰策略…...
【UnityShader入门精要学习笔记】(2)GPU流水线
本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 上节复习GPU流水线顶点着色…...
CSS免费在线字体格式转换器 CSS @font-face 生成器
今天竟意外发现的一款免费的“网页字体生成器”,功能强大又好用~ 工具地址:https://transfonter.org/ 根据你设置生成后的文件预览: 支持TTF、OTF、WOFF、WOFF2 或 SVG字体格式转换生成,每个文件最大15MB。转换完成以后还会生成一…...
Codeium在IDEA里的3个坑
转载自Codeium在IDEA里的3个坑:无法log in,downloading language server和中文乱码_downloading codeium language server...-CSDN博客文章浏览阅读1.7w次,点赞26次,收藏47次。Codeium安装IDEA插件的3个常见坑_downloading codeiu…...
C-C++ 项目构建指南:如何使用 Makefile 提高开发效率
Makefile是一个常用的自动化构建工具,它可以为开发人员提供方便的项目构建方式。在C/C项目中,Makefile可以用来编译、链接和生成可执行文件。使用Makefile的好处是可以自动执行一系列命令,从而减少手动操作的复杂性和出错的可能性。此外&…...
基于SpringBoot的图书管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 🚀🚀🚀SpringBoot 阿博图书管理系…...
矩阵对角线遍历
Diagonal 2614. 对角线上的质数 class Solution {public int diagonalPrime(int[][] nums) {int n = nums....
【教程】Typecho Joe主题开启并修复壁纸相册不显示问题
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 Joe主题本身支持“壁纸”功能,其实就是相册。当时还在网上找了好久相册部署的开源项目,太傻了。 但是网上教程很少,一没说如何开启壁纸功能,二没说开启后为…...
MR混合现实情景实训教学系统在法律专业课堂上的应用
MR混合现实情景实训教学系统是一种将虚拟现实(VR)、增强现实(AR)相结合的先进技术。在法律教学课堂上,MR教学系统为学生模拟模拟法庭、案例分析等多种形式,让学生在实践中掌握法律知识,提高法律…...
专注邯郸建设手机网站/uc信息流广告投放
转载请标明出处:http://blog.csdn.net/xx326664162/article/details/50512578 文章出自:薛瑄的博客 你也可以查看我的其他同类文章,也会让你有一定的收货! setMessage(),setText()解决方法一样,下面以setMessage()为…...
建设网站的3个必要条件/seo是什么软件
根据《网络世界》报道: 搜索巨人Google于7月21日发布了2006年第二财季财报,因为成功躲避了影响雅虎和易趣的行业增长减缓趋势,Google利润增长达到了110%。尽管Google的增长依然强劲,甚至高出华尔街分析师的预测,但这并…...
武汉网站制作好/数据网站
之前我们做的都是单表查询,那么问题来了,如果我们想要做多表关联查询该怎么处理呢,本篇Blog来探索关联查询(多对一关系)和集合查询(一对多关系)的实现方式。同样还是在之前的Person表基础上做一…...
eclipse sdk做网站/微营销推广方案
1,从spark的example中找到KafkaWordCount.scala文件复制到idea编辑器中,引入包:2,编辑configuration,(1)KafkaWordCountProducer选择KafkaWordCount.scala中的KafkaWordCountProducer方法VM options 设置为:-Dspark.masterlocal设置程序输入参数,Program arguments: localhost:…...
泰安网站建设制作服务/河南网站推广
Linux系统内核设置优化tcp网络,# vi /etc/sysctl.conf,添加以下内容 net.ipv4.tcp_syncookies 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭&a…...
北京大兴最专业的网站建设公司/广州网站营销优化qq
所有浏览器都支持该对象。Navigator 对象包含有关浏览器的信息。 Navigator 对象包含的属性描述了正在使用的浏览器。可以使用这些属性进行平台专用的配置。 <script type"text/JavaScript"> $(function(){ var browser{},matchReg; …...