Restfule

简介: + 无状态+ 面向资源,即访问地址时使用的是名词形式+ 使用HTTP动词

Restfule

特点

  • 无状态
  • 面向资源,即访问地址时使用的是名词形式
  • 使用HTTP动词

使用情况

  • 适用:面向资源,如增删改查
  • 不适用:面向过程,如登陆

Restfule成熟度

  1. L0:只需要api访问即可
  2. L1:面向资源写成api/touristRoutes而不是api/getTouristRoutes
  3. L2:使用HTTP动词利用GET\POST\PUT\PATCH\DELETE来区分操作
  4. L3:超媒体控制api的自我发现,即返回一个资源时,附带着返回对这条资源操作的相关链接

状态码

级别 常见状态码
1xx 不常用
2xx 200:ok,201:created,201:No Content
3xx 301/302:Moved Permanently,304:Not Modified
4xx 400:Bad Request,401:Unauthorized,403:Forbidden,404:Not Found
5xx 500:Internal Servel Error,502:Gateway

内容协商

浏览器会在头文件中的Accept下协商内容的格式,如application/json。.netCore默认是返回Json格式可以在program中修改:

builder.Services.AddControllers(opt=> {

   opt.ReturnHttpNotAcceptable=true;//默认是false,即只识别和返回json类型

   opt.OutputFormatters.Add(newXmlDataContractSerializerOutputFormatter());//可以返回xml类型,老方法,已经弃用

}).AddXmlDataContractSerializerFormatters();//新方法,可以输入和输入xml格式的内容

DTO

数据模型(Model)包含了很多不需要展示的信息。将需要展示的信息提取形成DTO模型对象

  1. Nuget安装AutoMapper.Extensions.Microsoft.DependencyInjection
  2. 创建Dto对象

//模型对象

publicclassTouristRoute

{

   [Key]

   publicGuidId { get; set; }

   [Required]

   [MaxLength(100)]

   publicstringTitle { get; set; }

   [Required]

   [MaxLength(1500)]

   publicstringDescription { get; set; }

   [Column(TypeName="decimal(18, 2)")]

   publicdecimalOriginalPrice { get; set; }

   [Range(0.0, 1.0)]

   publicdouble?DiscountPresent { get; set; }

   publicDateTimeCreateTime { get; set; }

   publicDateTime?UpdateTime { get; set; }

   publicDateTime?DepartureTime { get; set; }

   [MaxLength]

   publicstringFeatures { get; set; }

   [MaxLength]

   publicstringFees { get; set; }

   [MaxLength]

   publicstringNotes { get; set; }

   publicdouble?Rating { get; set; }

   publicTravelDays?TravelDays { get; set; }

   publicTripType?TripType { get; set; }

   publicDepartureCity?DepartureCity { get; set; }

}

//DTO对象

publicclassTouristRouteDto

{

   publicGuidId { get; set; }

   publicstringTitle { get; set; }

   publicstringDescription { get; set; }

   publicdecimalPrice { get; set; }// 计算方式:原价 * 折扣

   publicDateTimeCreateTime { get; set; }

   publicDateTime?UpdateTime { get; set; }

   publicDateTime?DepartureTime { get; set; }

   publicstringFeatures { get; set; }

   publicstringFees { get; set; }

   publicstringNotes { get; set; }

   publicdouble?Rating { get; set; }

   publicstringTravelDays { get; set; }// 枚举变成了string

   publicstringTripType { get; set; }// 枚举变成了string

   publicstringDepartureCity { get; set; }// 枚举变成了string

}

  1. 注册AutoMapper

//会自动扫描Profiles文件夹,对里面的映射设置进行处理

//扫描程序集中所有包含映射关系的profile文件并加载

builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

  1. 创建Profiles文件夹,并在里面增加映射文件

publicclassTouristRouteProfile:Profile

{

   publicTouristRouteProfile()

   {

       //默认自动匹配名称相同的字段

       CreateMap<TouristRoute, TouristRouteDto>()

           //其他需要的映射

           .ForMember(dest=>dest.Price,

                      opt=>opt.MapFrom(src=>src.OriginalPrice* (decimal)(src.DiscountPresent??1)))

           .ForMember(dest=>dest.TravelDays,

                      opt=>opt.MapFrom(src=>src.TravelDays.ToString()))

           .ForMember(dest=>dest.TripType,

                      opt=>opt.MapFrom(src=>src.TripType.ToString()))

           .ForMember(dest=>dest.DepartureCity,

                      opt=>opt.MapFrom(src=>src.DepartureCity.ToString())

           );

   }

}

  1. 在控制器中使用

[Route("api/[controller]")]

[ApiController]

publicclassTouristRoutesController : ControllerBase

{

   privateITourisTouteRepository_tourisTouteRepository;

   privatereadonlyIMapper_mapper;//增加注入

   publicTouristRoutesController(ITourisTouteRepositorytourisTouteRepository, IMappermapper)

   {

       _tourisTouteRepository=tourisTouteRepository;

       _mapper=mapper;

   }

   [HttpGet]

   publicIActionResultGetTouristRoutes()

   {

       varroutes=_tourisTouteRepository.GetTourisRoutes();

       if (routes==null||routes.Count()<=0)

       {

           returnNotFound("没有旅游路线");

       }

       //使用映射

       vartouristRouteDto=_mapper.Map<IEnumerable<TouristRouteDto>>(routes);

       returnOk(touristRouteDto);

   }

}


相关文章
|
SQL 关系型数据库 MySQL
mysql 简单的sql语句,入门级增删改查
介绍MySQL中的基本SQL语句,包括数据的增删改查操作,使用示例和简单的数据表进行演示。
mysql 简单的sql语句,入门级增删改查
|
.NET C# 容器
WPF自定义LED风格数字显示控件
原文:WPF自定义LED风格数字显示控件 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/article/details/52895167 ...
1904 0
|
Linux
阿里云ECS+WordPress建站常见问题及解决方案
收纳了Wordpress建站过程中可能会出现的Error: Unable to find a match: XXX以及仪表盘无法安装扩展、主题的解决方案,同时也是飞天加速计划·高校学生在家实践 续费任务文章
2328 2
阿里云ECS+WordPress建站常见问题及解决方案
|
消息中间件 负载均衡 Kafka
Kafka消费组重新平衡流程
Kafka消费组重新平衡流程
|
2月前
|
SQL 容灾 安全
云时代SQL Server的终极答案:阿里云 RDS SQL Server如何用异地容灾重构系统可靠性
在数字化转型的浪潮中,数据库的高可用性已成为系统稳定性的生命线。作为经历过多次生产事故的资深开发者,肯定深知传统自建SQL Server架构的脆弱性——直到遇见阿里云 RDS SQL Server,其革命性的异地容灾架构彻底改写了游戏规则。
|
7月前
|
机器学习/深度学习 人工智能 自然语言处理
AI 世界生存手册(二):从LR到DeepSeek,模型慢慢变大了,也变强了
大家都可以通过写 prompt 来和大模型对话,那大模型之前的算法是怎样的,算法世界经过了哪些比较关键的发展,最后为什么是大模型这条路线走向了 AGI,作者用两篇文章共5.7万字详细探索一下。 第一篇文章指路👉《AI 世界生存手册(一):从LR到DeepSeek,模型慢慢变大了,也变强了》
AI 世界生存手册(二):从LR到DeepSeek,模型慢慢变大了,也变强了
|
9月前
|
机器学习/深度学习 开发框架 人工智能
操作系统生态兼容与创新的平衡艺术
本次分享的主题是操作系统生态兼容与创新的平衡艺术,由中科方德周杰分享。主要分为五个部分: 1.操作系统生态中的兼容与创新之争 2.版本进化中库兼容与隔离平衡 3.跨架构生态的隔离与统一 4.多系统融合的生态新可能 5.生态兼容与创新平衡
199 2
|
10月前
|
存储 缓存 Java
HashMap源码剖析-put流程
更好地掌握 `HashMap` 的内部实现原理,提高编写高效代码的能力。掌握这些原理不仅有助于优化性能,还可以帮助解决实际开发中的问题。
220 13
|
移动开发 前端开发
基于jeecg-boot的flowable流程历史记录显示修改
基于jeecg-boot的flowable流程历史记录显示修改
249 0
|
Linux
如何检查CentOS版本:5种方法
这个文件包含了CentOS的详细版本信息,包括版本号、架构等。
3137 0