多些一些总没坏处

一个后端接口大致分为四个部分组成:接口地址(url)、接口请求方式(get、post等)、请求数据(request)、响应数据(response)。如何构建这几个部分每个公司要求都不同,没有什么“一定是最好的”标准,但一个优秀的后端接口和一个糟糕的后端接口对比起来差异还是蛮大的,其中最重要的关键点就是看是否规范!

本文就一步一步演示如何构建起一个优秀的后端接口体系,体系构建好了自然就有了规范,同时再构建新的后端接口也会十分轻松。

所需依赖包
这里用的是SpringBoot配置项目,本文讲解的重点是后端接口,所以只需要导入一个spring-boot-starter-web包就可以了:

org.springframework.boot spring-boot-starter-web 本文还用了swagger来生成API文档,lombok来简化类,不过这两者不是必须的,可用可不用。

参数校验
一个接口一般对参数(请求数据)都会进行安全校验,参数校验的重要性自然不必多说,那么如何对参数进行校验就有讲究了。

业务层校验
首先我们来看一下最常见的做法,就是在业务层进行参数校验:

public String addUser(User user) {
if (user == null || user.getId() == null || user.getAccount() == null || user.getPassword() == null || user.getEmail() == null) {
return “对象或者对象字段不能为空”;
}
if (StringUtils.isEmpty(user.getAccount()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getEmail())) {
return “不能输入空字符串”;
}
if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {
return “账号长度必须是6-11个字符”;
}
if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {
return “密码长度必须是6-16个字符”;
}
if (!Pattern.matches("1+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {
return “邮箱格式不正确”;
}
// 参数校验完毕后这里就写上业务逻辑
return “success”;
}
这样做当然是没有什么错的,而且格式排版整齐也一目了然,不过这样太繁琐了,这还没有进行业务操作呢光是一个参数校验就已经这么多行代码,实在不够优雅。

我们来改进一下,使用Spring Validator和Hibernate Validator这两套Validator来进行方便的参数校验!这两套Validator依赖包已经包含在前面所说的web依赖包里了,所以可以直接使用。

Validator + BindResult进行校验
Validator可以非常方便的制定校验规则,并自动帮你完成校验。首先在入参里需要校验的字段加上注解,每个注解对应不同的校验规则,并可制定校验失败后的信息:

@Data
public class User {
@NotNull(message = “用户id不能为空”)
private Long id;

@NotNull(message = "用户账号不能为空")
@Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")
private String account;

@NotNull(message = "用户密码不能为空")
@Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")
private String password;

@NotNull(message = "用户邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;

}
校验规则和错误提示信息配置完毕后,接下来只需要在接口需要校验的参数上加上@Valid注解,并添加BindResult参数即可方便完成验证:
@RestController
@RequestMapping(“user”)
public class UserController {
@Autowired
private UserService userService;

@PostMapping("/addUser")
public String addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
    // 如果有参数校验失败,会将错误信息封装成对象组装在BindingResult里
    for (ObjectError error : bindingResult.getAllErrors()) {
        return error.getDefaultMessage();
    }
    return userService.addUser(user);
}

}
这样当请求数据传递到接口的时候Validator就自动完成校验了,校验的结果就会封装到BindingResult中去,如果有错误信息我们就直接返回给前端,业务逻辑代码也根本没有执行下去。

此时,业务层里的校验代码就已经不需要了:

public String addUser(User user) {
// 直接编写业务逻辑
return “success”;
}
现在可以看一下参数校验效果。我们故意给这个接口传递一个不符合校验规则的参数,先传递一个错误数据给接口,故意将password这个字段不满足校验条件:

{
“account”: “12345678”,
“email”: “123@qq.com”,
“id”: 0,
“password”: “123”
}
再来看一下接口的响应数据:

这样是不是方便很多?不难看出使用Validator校验有如下几个好处:

(1)简化代码,之前业务层那么一大段校验代码都被省略掉了。

(2)使用方便,那么多校验规则可以轻而易举的实现,比如邮箱格式验证,之前自己手写正则表达式要写那么一长串,还容易出错,用Validator直接一个注解搞定。(还有更多校验规则注解,可以自行去了解哦)

(3)减少耦合度,使用Validator能够让业务层只关注业务逻辑,从基本的参数校验逻辑中脱离出来。

使用Validator+ BindingResult已经是非常方便实用的参数校验方式了,在实际开发中也有很多项目就是这么做的,不过这样还是不太方便,因为你每写一个接口都要添加一个BindingResult参数,然后再提取错误信息返回给前端。

这样有点麻烦,并且重复代码很多(尽管可以将这个重复代码封装成方法)。我


  1. a-zA-Z0-9_- ↩︎

<think>好的,用户让我介绍一下C#,并且多出些相关内容。首先,我需要确定用户的背景和需求。他们可能是刚开始学习编程,或者有其他语言经验想转C#。也可能是在开发某个项目需要用到C#,想深入了解。 接下来,我应该覆盖C#的基础知识,比如语言特性、开发环境、基本语法。然后可能需要进阶内容,如面向对象、LINQ、异步编程等。实际应用场景和资源推荐也会有帮助。 需要确保结构清晰,分步骤介绍。比如先概述,再基础语法,然后关键特性,应用场景,学习资源。注意用户提到的系统级指令,数学公式要用正确格式,但C#介绍可能涉及代码示例,需要用代码块,但用户有特别要求代码格式,可能用Markdown的代码块。 还要检查LaTeX是否符合要求,虽然C#内容可能较少数学公式,但如果有的话,比如算法中的公式,需要正确使用$...$或$$...$$。不过可能这部分内容不多,但需要留意。 可能需要避免太专业的术语,或者解释清楚术语。比如CLR、GC等,需要简单说明。同时,用户希望尽量真实可靠,所以信息要准确,比如版本特性要对应正确。 最后,确保用中文,口语化,分段清晰,帮助用户逐步理解。可能需要举例说明,比如代码示例,但用户有明确要求代码,但介绍语言时,代码示例有助于理解,所以可以加入简单例子,用代码块展示。 结结构:概述、开发环境、基础语法、关键特性、应用场景、学习资源。每部分分点,用标题分隔。确保回答全面,满足用户“多出些”的需求,覆盖足够多的方面。</think>以下是对C#语言的系统化介绍,分为基础概念、核心特性和应用场景三部分,以结构化方式呈现: # 一、C#语言基础 1. **语言本质** - 类型安全的面向对象语言 - 运行于.NET Framework/.NET Core平台 - 编译为CIL中间语言(通过CLR执行) - 支持垃圾回收(GC)机制 2. **开发环境** ```csharp // 基础代码结构示例 using System; class Program { static void Main() { Console.WriteLine("Hello World"); } } ``` 3. **基础语法特征** - 强类型系统(var关键字支持类型推断) - 支持泛型、委托、事件 - 异常处理机制(try/catch/finally) - 命名空间管理 # 二、核心进阶特性 1. **LINQ技术** ```csharp var query = from num in numbers where num % 2 == 0 select num * 2; ``` 2. **异步编程模型** ```csharp async Task GetDataAsync() { var data = await httpClient.GetStringAsync(url); return ProcessData(data); } ``` 3. **模式匹配增强** ```csharp switch (shape) { case Circle c: Console.WriteLine($"Radius: {c.Radius}"); break; case Rectangle r when r.Width == r.Height: Console.WriteLine("Square"); break; } ``` # 三、跨平台开发能力 1. **MAUI框架** - 单代码库支持iOS/Android/Windows/macOS - XAML界面设计 - 热重载功能 2. **ASP.NET Core** ```csharp // Web API控制器示例 [ApiController] [Route("[controller]")] public class UsersController : ControllerBase { [HttpGet("{id}")] public IActionResult GetUser(int id) { // 数据操作逻辑 } } ``` # 四、性能关键特性 1. **Span<T>类型** - 减少内存分配 - 支持堆栈分配 - 高效数据切片操作 2. **硬件级优化** - SIMD指令支持(System.Numerics
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值