做网站页面的需要哪些技巧工业设计作品集网站

diannao/2026/1/25 0:28:46/文章来源:
做网站页面的需要哪些技巧,工业设计作品集网站,网站 建设阶段,做小程序的公司有哪些比较好1前言开发接口#xff0c;是给客户端#xff08;Web前端、App#xff09;用的#xff0c;前面说的RESTFul#xff0c;是接口的规范#xff0c;有了统一的接口风格#xff0c;客户端开发人员在访问后端功能的时候能更快找到需要的接口#xff0c;能写出可维护性更高的代…1前言开发接口是给客户端Web前端、App用的前面说的RESTFul是接口的规范有了统一的接口风格客户端开发人员在访问后端功能的时候能更快找到需要的接口能写出可维护性更高的代码。而接口的数据返回格式也是接口规范的重要一环不然一个接口返回JSON一个返回纯字符串客户端对接到数据时一脸懵逼没法处理啊。合格的接口返回值应该包括状态码、提示信息和数据。就像这样{statusCode: 200,successful: true,message: null,data: {} }默认AspNetCore的WebAPI模板是没有特定的返回格式因为这些业务性质的东西需要开发者自己来定义和完成。在前面的文章中可以看到本项目的接口返回值都是 ApiResponse 及其派生类型这就是在StarBlog里定制的统一返回格式。事实上我的其他项目也在用这套接口返回值这已经算是一个 Utilities 性质的组件了。PS今天写这篇文章时我顺手把这个返回值发布了一个nuget包以后在其他项目里使用就不用复制粘贴了~2分析一下在 AspNetCore 里写 WebApi 我们的 Controller 需要继承 ControllerBase 这个类接口 Action 可以设置返回值为 IActionResult 或 ActionResultT 类型然后返回数据的时候可以使用 ControllerBase 封装好的 Ok(), NotFound() 等方法这些方法在返回数据的同时会自动设置响应的HTTP状态码。PS关于 IActionResult 或 ActionResultT 这俩的区别请参考官方文档。本文只提关键的一点ActionResultT返回类型可以让接口在swagger文档中直观看出返回的数据类型。所以我们不仅要封装统一的返回值还要实现类似 Ok(), NotFound(), BadRequest() 的快捷方法。显然当接口返回类型全都是 ApiResponseT 时这样返回的状态码都是200不符合需求。而且有些接口之前已经写好了返回类型是 ListT 这类的我们也要把这些接口的返回值包装起来统一返回格式。要解决这些问题我们得了解一下 AspNetCore 的管道模型。AspNetCore 管道模型最外层是中间件一个请求进来经过一个个中间件到最后一个中间件生成响应再依次经过一个个中间件走出来得到最终响应。image常用的 AspNetCore 项目中间件有这些如下图所示image最后的 Endpoint 就是最终生成响应的中间件。在本项目中Program.cs 配置里的最后一个中间件就是添加了一个处理 MVC 的 Endpointapp.MapControllerRoute(name: default,pattern: {controllerHome}/{actionIndex}/{id?});这个 Endpoint 的结构又是这样的image可以看到有很多 Filter 包围在用户代码的前后。所以得出结论要修改请求的响应我们可以选择写一个中间件处理使用过滤器(Filter)那么来开始写代码吧~3定义ApiResponse首先是这个出现频率很高的 ApiResponse终于要揭晓了~在 StarBlog.Web/ViewModels/Response 命名空间下我创建了三个文件分别是ApiResponse.csApiResponsePaged.cs: 分页响应IApiResponse.cs: 几个相关的接口ApiResponse.cs 中其实是两个类一个 ApiResponseT 另一个 ApiResponse带泛型和不带泛型。PSC#的泛型有点复杂当时搞这东西搞得晕晕的又复习了一些逆变和协变不过最终没有用上。接口代码上代码先是几个接口的代码public interface IApiResponse {public int StatusCode { get; set; }public bool Successful { get; set; }public string? Message { get; set; } }public interface IApiResponseT : IApiResponse {public T? Data { get; set; } }public interface IApiErrorResponse {public Dictionarystring,object ErrorData { get; set; } }保证了所有相关对象都来自 IApiResponse 接口。ApiResponseT接着看 ApiResponseT 的代码。public class ApiResponseT : IApiResponseT {public ApiResponse() {}public ApiResponse(T? data) {Data  data;}public int StatusCode { get; set; }  200;public bool Successful { get; set; }  true;public string? Message { get; set; }public T? Data { get; set; }/// summary/// 实现将 see crefApiResponse/ 隐式转换为 see crefApiResponse{T}//// /summary/// param nameapiResponsesee crefApiResponse//parampublic static implicit operator ApiResponseT(ApiResponse apiResponse) {return new ApiResponseT {StatusCode  apiResponse.StatusCode,Successful  apiResponse.Successful,Message  apiResponse.Message};} }这里使用运算符重载实现了 ApiResponse 到 ApiResponseT 的隐式转换。等下就能看出有啥用了~ApiResponse继续看 ApiResponse 代码比较长封装了几个常用的方法在里面会有一些重复代码。这个类实现了俩接口IApiResponse, IApiErrorResponsepublic class ApiResponse : IApiResponse, IApiErrorResponse {public int StatusCode { get; set; }  200;public bool Successful { get; set; }  true;public string? Message { get; set; }public object? Data { get; set; }/// summary/// 可序列化的错误/// para用于保存模型验证失败的错误信息/para/// /summarypublic Dictionarystring,object? ErrorData { get; set; }public ApiResponse() {}public ApiResponse(object data) {Data  data;}public static ApiResponse NoContent(string message  NoContent) {return new ApiResponse {StatusCode  StatusCodes.Status204NoContent,Successful  true, Message  message};}public static ApiResponse Ok(string message  Ok) {return new ApiResponse {StatusCode  StatusCodes.Status200OK,Successful  true, Message  message};}public static ApiResponse Ok(object data, string message  Ok) {return new ApiResponse {StatusCode  StatusCodes.Status200OK,Successful  true, Message  message,Data  data};}public static ApiResponse Unauthorized(string message  Unauthorized) {return new ApiResponse {StatusCode  StatusCodes.Status401Unauthorized,Successful  false, Message  message};}public static ApiResponse NotFound(string message  NotFound) {return new ApiResponse {StatusCode  StatusCodes.Status404NotFound,Successful  false, Message  message};}public static ApiResponse BadRequest(string message  BadRequest) {return new ApiResponse {StatusCode  StatusCodes.Status400BadRequest,Successful  false, Message  message};}public static ApiResponse BadRequest(ModelStateDictionary modelState, string message  ModelState is not valid.) {return new ApiResponse {StatusCode  StatusCodes.Status400BadRequest,Successful  false, Message  message,ErrorData  new SerializableError(modelState)};}public static ApiResponse Error(string message  Error, Exception? exception  null) {object? data  null;if (exception ! null) {data  new {exception.Message,exception.Data};}return new ApiResponse {StatusCode  StatusCodes.Status500InternalServerError,Successful  false,Message  message,Data  data};} }ApiResponsePagedT这个分页是最简单的只是多了个 Pagination 属性而已public class ApiResponsePagedT : ApiResponseListT where T : class {public ApiResponsePaged() {}public ApiResponsePaged(IPagedListT pagedList) {Data  pagedList.ToList();Pagination  pagedList.ToPaginationMetadata();}public PaginationMetadata? Pagination { get; set; } }4类型隐式转换来看这个接口public ApiResponsePost Get(string id) {var post  _postService.GetById(id);return post  null ? ApiResponse.NotFound() : new ApiResponsePost(post); }根据上面的代码可以发现 ApiResponse.NotFound() 返回的是一个 ApiResponse 对象但这接口的返回值明明是 ApiResponsePost 类型呀这不是类型不一致吗不过在 ApiResponseT 中我们定义了一个运算符重载实现了 ApiResponse 类型到 ApiResponseT 的隐式转换所以就完美解决这个问题大大减少了代码量。不然原本是要写成这样的return post  null ? new ApiResponsePost {StatusCode  StatusCodes.Status404NotFound,Successful  false, Message  未找到} : new ApiResponsePost(post);现在只需简简单单的 ApiResponse.NotFound()就跟 AspNetCore 自带的一样妙~5包装返回值除了这些以 ApiResponse 或 ApiResponseT 作为返回类型的接口还有很多其他返回类型的接口比如public ListConfigItem GetAll() {return _service.GetAll(); }还有public async Taskstring Poem() {return await _crawlService.GetPoem(); }这些接口在 AspNetCore 生成响应的时候会把这些返回值归类为 ObjectResult 如果不做处理就会直接序列化成不符合我们返回值规范的格式。这个不行必须对这部分接口的返回格式也统一起来。因为种种原因最终我选择使用过滤器来实现这个功能。关于过滤器的详细用法可以参考官方文档本文就不展开了直接上代码。创建文件 StarBlog.Web/Filters/ResponseWrapperFilter.cspublic class ResponseWrapperFilter : IAsyncResultFilter {public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) {if (context.Result is ObjectResult objectResult) {if (objectResult.Value is IApiResponse apiResponse) {objectResult.StatusCode  apiResponse.StatusCode;context.HttpContext.Response.StatusCode  apiResponse.StatusCode;}else {var statusCode  objectResult.StatusCode ?? context.HttpContext.Response.StatusCode;var wrapperResp  new ApiResponseobject {StatusCode  statusCode,Successful  statusCode is  200 and  400,Data  objectResult.Value,};objectResult.Value  wrapperResp;objectResult.DeclaredType  wrapperResp.GetType();}}await next();} }在代码中进行判断当响应的类型是 ObjectResult 时把这个响应结果拿出来再判断是不是 IApiResponse 类型。前面我们介绍过所有 ApiResponse 都实现了 IApiResponse 这个接口所以可以判断是不是 IApiResponse 类型来确定这个返回结果是否包装过。没包装的话就给包装一下就这么简单。之后在 Program.cs 里注册一下这个过滤器。var mvcBuilder  builder.Services.AddControllersWithViews(options  { options.Filters.AddResponseWrapperFilter(); } );6搞定这样就完事儿啦~最后所有接口可序列化的返回格式就都变成了这样{statusCode: 200,successful: true,message: null,data: {} }强迫症表示舒服了~PS对了返回文件的那类接口除外。7在其他项目中使用这个 ApiRepsonse 我已经发布了nuget包需要在其他项目使用的话可以直接安装 CodeLab.Share 这个包引入 CodeLab.Share.ViewModels.Response 命名空间就完事了~不用每次都复制粘贴这几个类还得改命名空间。PS这个包里不包括过滤器8参考资料https://learn.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?viewaspnetcore-7.09系列文章基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目基于.NetCore开发博客项目 StarBlog - (3) 模型设计基于.NetCore开发博客项目 StarBlog - (4) markdown博客批量导入基于.NetCore开发博客项目 StarBlog - (5) 开始搭建Web项目基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表基于.NetCore开发博客项目 StarBlog - (7) 页面开发之文章详情页面基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示基于.NetCore开发博客项目 StarBlog - (9) 图片批量导入基于.NetCore开发博客项目 StarBlog - (10) 图片瀑布流基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化基于.NetCore开发博客项目 StarBlog - (21) 开始开发RESTFul接口基于.NetCore开发博客项目 StarBlog - (22) 开发博客文章相关接口基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序基于.NetCore开发博客项目 StarBlog - (24) 统一接口数据返回格式

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

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

相关文章

江门网站定制多少钱在东莞做

深入解析Java 22:专栏介绍 Java,作为一种广泛使用的编程语言,一直以来都在不断地发展和改进。2024年3月19日,Java 22的GA版本正式发布,带来了众多令人瞩目的新特性和性能优化。本专栏将深入解析Java 22,带…

对于网站建设的体会设计之家室内设计

一、前言每一个Linux驱动工程师都知道这样一个准则:在中断上下文中不能睡眠。但是为什么interrupt context中不能调用导致睡眠的kernel API呢?如果驱动这么做会导致什么样的后果呢?这就是本文探讨的主题。为了理解这个主题,我们设…

用python做网站的多吗永嘉做网站

这里写目录标题 1. 下载Mendeley 并插入到Word1.1 下载安装1.2 在Word 中添加Mendeley 插件文献引用相关 1. 下载Mendeley 并插入到Word 1.1 下载安装 Mendeley 官网下载 1.2 在Word 中添加Mendeley 插件 打开 Mendeley,点击 Tools —>Install Mendeley Cite…

经过学习网站开发后的心得体会网页源代码拿到后怎么使用

( )程序包用于读写操作系统文本文件。(选一项)A、Dbms_outputB、Dbms_lobC、Dbms_randomD、Utl_file( )触发器允许触发操作的语句访问行的列值。(选一项)A、行级B、语句级C、模式D、数据库级( )是oracle在启动期间用来标识物理文件和数据文件的二进制文件。(选一项)A、控制文件…

网络运营部wordpress 纯代码seo

解决代码: .el-table {/deep/ .el-table__body-wrapper {overflow-x: scroll !important;//直接设置横轴内容滚动条 即可撑高高度 还不影响使用} }一、情景:给element的el-table设置fixed固定后,最后一行显示部分被遮挡。有的说是有时出现这…

哈尔滨建筑专业网站家具网站怎么做

Clean Sheet是适用于Windows 10的符合人体工程学的Eclipse主题。它基于干净,低眩光的外观和感觉,旨在减轻视觉疲劳和眼睛疲劳。 它融合了均衡的颜色选择,可以突出谐波语法并注重可读性。 除自定义滚动条外,它还努力满足现代美学要…

服务器分配网络提高网站访问速度网站建设公司经营

做开发时,经常遇到服务器监控报警,日志占据大量的磁盘空间,需要清理。每次手动清理很麻烦。这里分享一些定时清理的脚本,减轻运维的工作量。将sh脚本与crontab定时任务结合,实现定时清理。 nacos日志清理脚本 nacos也…

域名解析网站什么意思vue做的网站

前面的文章我们介绍了系统应用解析流程和通过 PackageInstaller.apk安装应用程序的相关流程,这一篇我们来分析使用 ADB 命令来实现 APK 安装流程。 一、ADB安装命令 ADB命令使用 adb install [选项] [APK绝对路径] 常见选项如下: -r:覆盖安装,保存原有数据; -t:…

免费个人域名网站网站建设需要钱吗

在官网可编辑表格typescript样例里 const inputRef useRef<InputRef>(null); InputRef项目报错原因是ant design的版本问题! antd 4.19版本重写了input 可通过InputRef来使用input组件的ref

住建部网站查询系统网站服务器用来做啥

1故事背景 忘记密码这件事&#xff0c;相信绝大多数人都遇到过&#xff0c;输一次错一次&#xff0c;错到几次以上&#xff0c;就不允许你继续尝试了。 但当你尝试重置密码&#xff0c;又发现新密码不能和原密码重复&#xff1a; 图片 相信此刻心情只能用一张图形容&#xf…

沈阳专业网站建设企业站长工具seo综合查询怎么用

姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作&#xff0c;而各部分的客户端的操作都要与服务器端通信&#xff0c;所以在今天的调试中&#xff0c;我贯穿于各部分模块的调试和检测&#xff0c;主要负责在出现问题…

博学云网站建设怎么把自己做的网站发布到网上

转载自 关于java.util.Properties读取中文乱码的正确解决方案&#xff08;不要再用native2ascii.exe了&#xff09; 碰到了用java.util.Properties读取中文内容&#xff08;UTF-8格式&#xff09;的配置文件&#xff0c;发生中文乱码的现象&#xff0c; Properties propnew Pro…

做水果网站特点分析wordpress插件xiazai

1. Serial GC Serial GC 是用于单线程环境的垃圾回收器&#xff0c;它使用复制算法&#xff08;Copy&#xff09;进行年轻代的垃圾回收&#xff0c;而老年代则使用标记-整理&#xff08;Mark-Compact&#xff09;算法。由于它在进行垃圾回收时会暂停其他所有的工作线程&#xf…

深圳网站建设小江宁夏交通建设有限公司网站

文章目录 文章开篇Json简介Json数据类型Json硬性规则Json数据转化网站Json和Dict类型转换json模块的使用Python数据和Json数据的类型映射json.dumps1.字典数据中含有**存在中文**2.json数据通过缩进符**美观输出**3.对Python数据类型中键进行**排序输出**4.json数据**分隔符的控…

网站建设与网页设计百度文库微信小程序登录流程

一、类与类加载器 类加载器虽然只用于实现类的加载动作&#xff0c;但它在Java程序中起到的作用却远超类加载阶段。对于 任意一个类&#xff0c;都必须由加载它的类加载器和这个类本身一起共同确立其在Java虚拟机中的唯一性&#xff0c;每一个类加载器&#xff0c;都拥有一个独…

在线做GO分析的网站永久免费asp空间

uniapp是一款跨平台的应用开发框架&#xff0c;基于Vue.js和小程序原生能力进行封装&#xff0c;旨在帮助开发者快速构建跨平台的应用程序。在uniapp中&#xff0c;可以使用Vue.js语法进行页面开发&#xff0c;同时通过使用小程序原生能力&#xff0c;可以实现调用设备的摄像头…

福永营销型网站多少钱做网站做58好还是赶集好

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

广州做鞋的网站wordpress评论回复邮件通知

Android中可以直接使用webView来加载HTML5通过video标签来播放视频。以下为基本步骤&#xff1a;一、需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别&#xff0c;如果不需要的View可以声明不要用加速&#xff0c;但是需要在代码中做具…

网站建设从入门pdf做网站如何团队分工

win10安装docker后发现c盘空间急速减少&#xff0c;360管家查看发现images镜像安装在C盘&#xff0c;于是重装docker desktop以为在安装过程中能够选择&#xff0c;遗憾的是没有提供选择权限&#xff0c;默认直接就安装到了c盘。 desktop 迁移 百度得知可以将c盘的docker安装…