当前位置: 首页 > news >正文

建筑模板尺寸及价格企业网站seo贵不贵

建筑模板尺寸及价格,企业网站seo贵不贵,水产网站模板,成都网站建设 城需求 接口的返回响应&#xff0c;封装成统一的数据格式&#xff0c;再返回给前端。 依赖 对于SpringBoot项目&#xff0c;接口层基于 SpringWeb&#xff0c;也就是 SpringMVC。 <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

需求

接口的返回响应,封装成统一的数据格式,再返回给前端。

依赖

对于SpringBoot项目,接口层基于 SpringWeb,也就是 SpringMVC

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

说明

为了使接口的返回结果数据更加规范化,便于接口测试和前端处理,需要以统一的格式来返回数据;

为了不在每一个接口里面,都写一段返回数据封装的代码,将数据封装的逻辑提取出来,使用切面(AOP)原理,统一对数据进行封装。

如上,涉及到两个问题:

  1. 定义:响应实体的数据结构;
  2. 响应数据统一封装;

下面,我们分别来介绍这两个问题如何处理。

响应实体的数据结构

数据结构

返回响应,统一封装实体,数据结构如下:
在这里插入图片描述

代码

package com.example.core.model;import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;/*** 返回响应,统一封装实体** @param <T> 数据实体泛型*/
@Getter
@ToString
@EqualsAndHashCode
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Schema(name = "返回响应", description = "返回响应,统一封装实体")
public class Result<T> {@Schema(description = "用户提示", example = "操作成功!")private String userMessage;/*** 错误码<br>* 调用成功时,为 null。<br>* 示例:A0211*/@Schema(description = "错误码")private String errorCode;/*** 错误信息<br>* 调用成功时,为 null。<br>* 示例:"用户输入密码错误次数超限"*/@Schema(description = "错误信息")private String errorMessage;/*** 数据实体(泛型)<br>* 当接口没有返回数据时,为 null。*/@Schema(description = "数据实体(泛型)")private T data;public static <T> Result<T> success(T data) {return new Result<>("操作成功!", null, null, data);}public static <T> Result<T> fail(String userMessage, String errorCode, String errorMessage) {return new Result<>(userMessage, errorCode, errorMessage, null);}}

特别说明:不需要表示成功或失败的字段

在本处的数据结构中,没有一个专门用来表示接口请求成功或失败的字段(比如:success 或 code)。

推荐的做法是:使用 HTTP状态码表示请求是否成功;最简单的模型是,当状态码为200时,表示成功;当状态码为 3xx,4xx,5xx 时,代表请求失败。

HTTP的状态码,已经清晰的描述了请求的响应状态(成功/失败)。

复杂模型中,http状态码还包含请求成功的类型和失败的原因。
复杂模型中,成功的类型:

HTTP状态码含义
200 OK请求成功
201 Created新增成功
202 Accepted成功,异步任务已经接收

成功的类型:

HTTP状态码含义
400 Bad Request失败,客户端请求错误(比如,参数传递错误)
401 Unauthorized失败,未登录
403 Forbidden失败,未授权

响应统一封装

响应统一封装:基于 ResponseBodyAdvice

基于面相切面编程(AOP)原理,每个接口方法调用成功后,在返回给客户端前,会进行指定的处理,这里是响应数据统一封装成指定的格式;其实也可以做其他的事情,比如 加密。

代码

package com.example.core.advice;import com.example.core.model.Result;
import com.example.core.util.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;/*** 响应统一封装* <p>* 将响应数据,封装成统一的数据格式。* <p>* 通过本处理器,将接口方法返回的数据,统一封装到 Result 的 data 字段中,如果接口方法返回为 void,则 data 字段的值为 null。*/
@Slf4j
@RestControllerAdvice(basePackages = "com.example.web")
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {/*** 此组件是否支持给定的控制器方法返回类型和选定的 {@code HttpMessageConverter} 类型。** @return 如果应该调用 {@link #beforeBodyWrite} ,则为 {@code true};否则为false。*/@Overridepublic boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {// 返回类型不为Result,才需要封装return returnType.getParameterType() != Result.class;}/*** 统一封装返回响应数据*/@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,ServerHttpResponse response) {// 数据封装为Result:将接口方法返回的数据,封装到 Result.data 字段中。Result<Object> result = Result.success(body);// 返回类型不是 String:直接返回if (returnType.getParameterType() != String.class) {return result;}// 返回类型是 String:不能直接返回,需要进行额外处理// 1. 将 Content-Type 设为 application/json ;返回类型是String时,默认 Content-Type = text/plainHttpHeaders headers = response.getHeaders();headers.setContentType(MediaType.APPLICATION_JSON);// 2. 将 Result 转为 Json字符串 再返回// (否则会报错 java.lang.ClassCastException: com.example.core.model.Result cannot be cast to java.lang.String)return JsonUtil.toJson(result);}}

补充说明

需要注意两点:

  1. 返回类型不为 Result,才需要封装;
  2. 返回类型是 String,需要进行额外处理,不能直接返回,否则会报错。

如果返回类型是 Result 也封装,就会使得接口返回中多一层 Result 嵌套;

SpringWeb的接口如果返回值为String类型,默认 Content-Type = text/plain,需要手动设置为 application/json
返回类型为String时,接口必须返回String,否则会报错 ClassCastException,所以需要将封装好的Result 转换成JSON字符串后返回;

测试

代码

package com.example.web.exception.controller;import com.example.core.log.annotation.ApiLog;
import com.example.core.model.PageQuery;
import com.example.web.exception.query.UserQuery;
import com.example.web.model.vo.UserVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;@Slf4j
@RestController
@RequestMapping("exception")
@Tag(name = "异常统一处理")
public class ExceptionController {@ApiLog@GetMapping(path = "users")@Operation(summary = "查询用户列表", description = "测试:BindException。参数校验异常:Get请求,Query参数,以对象的形式接收。")public List<UserVO> listUsers(@Valid UserQuery userQuery, PageQuery pageQuery,HttpServletRequest request, HttpServletResponse response, HttpSession session) {log.info("查询用户列表。userQuery={},pageQuery={}", userQuery, pageQuery);String queryName = userQuery.getName();String queryPhone = userQuery.getMobilePhone();return listMockUsers().stream().filter(user -> {boolean isName = true;boolean isPhone = true;if (StringUtils.hasText(queryName)) {isName = user.getName().contains(queryName);}if (StringUtils.hasText(queryPhone)) {isPhone = user.getMobilePhone().contains(queryPhone);}return isName && isPhone;}).collect(Collectors.toList());}private List<UserVO> listMockUsers() {List<UserVO> list = new ArrayList<>();UserVO vo = new UserVO();vo.setId("1234567890123456789");vo.setName("张三");vo.setMobilePhone("18612345678");vo.setEmail("zhangsan@qq.com");vo.setBeginTime(new Date());vo.setEndTime(new Date());vo.setBeginDate(new Date());vo.setEndDate(new Date());list.add(vo);UserVO vo2 = new UserVO();vo2.setId("1234567890123456781");vo2.setName("李四");vo2.setMobilePhone("13412345678");vo2.setEmail("lisi@example.com");vo2.setBeginTime(new Date());vo2.setEndTime(new Date());vo2.setBeginDate(new Date());vo2.setEndDate(new Date());list.add(vo2);return list;}}

效果

在这里插入图片描述


文章转载自:
http://intervertebral.przc.cn
http://ridgeway.przc.cn
http://jirga.przc.cn
http://antre.przc.cn
http://semiopaque.przc.cn
http://microzyme.przc.cn
http://fast.przc.cn
http://mesodont.przc.cn
http://disdain.przc.cn
http://underdose.przc.cn
http://gaur.przc.cn
http://centering.przc.cn
http://hawash.przc.cn
http://berwick.przc.cn
http://landon.przc.cn
http://psellism.przc.cn
http://sequela.przc.cn
http://multiresistant.przc.cn
http://acini.przc.cn
http://buddhism.przc.cn
http://edc.przc.cn
http://antianxiety.przc.cn
http://acropetal.przc.cn
http://laterad.przc.cn
http://unaccustomed.przc.cn
http://spectrophosphorimeter.przc.cn
http://cottonweed.przc.cn
http://meager.przc.cn
http://deltiology.przc.cn
http://germanize.przc.cn
http://fundamentality.przc.cn
http://leeringly.przc.cn
http://otophone.przc.cn
http://othman.przc.cn
http://arraignment.przc.cn
http://cowbind.przc.cn
http://condemn.przc.cn
http://woodworking.przc.cn
http://ultimatistic.przc.cn
http://wud.przc.cn
http://flake.przc.cn
http://precursive.przc.cn
http://faineant.przc.cn
http://zoan.przc.cn
http://groceteria.przc.cn
http://raphe.przc.cn
http://martingale.przc.cn
http://entries.przc.cn
http://epicrisis.przc.cn
http://crosstie.przc.cn
http://jolly.przc.cn
http://surely.przc.cn
http://snifty.przc.cn
http://participancy.przc.cn
http://touchable.przc.cn
http://monocle.przc.cn
http://sadic.przc.cn
http://expostulatingly.przc.cn
http://refutably.przc.cn
http://fissure.przc.cn
http://gerontotherapeutics.przc.cn
http://advisor.przc.cn
http://tachyhydrite.przc.cn
http://sideswipe.przc.cn
http://zooblast.przc.cn
http://durance.przc.cn
http://bookful.przc.cn
http://smolt.przc.cn
http://experimental.przc.cn
http://petasos.przc.cn
http://detach.przc.cn
http://accelerometer.przc.cn
http://lithoid.przc.cn
http://kashmirian.przc.cn
http://classical.przc.cn
http://brachycephalic.przc.cn
http://aurum.przc.cn
http://embryogenesis.przc.cn
http://biaxial.przc.cn
http://internuptial.przc.cn
http://plunder.przc.cn
http://tribalism.przc.cn
http://pyrographic.przc.cn
http://sister.przc.cn
http://disinform.przc.cn
http://syndet.przc.cn
http://gloaming.przc.cn
http://leukocyte.przc.cn
http://pyrolyzate.przc.cn
http://insectival.przc.cn
http://iucd.przc.cn
http://maytide.przc.cn
http://amerenglish.przc.cn
http://invalidation.przc.cn
http://assertorily.przc.cn
http://carburetor.przc.cn
http://tractably.przc.cn
http://chink.przc.cn
http://comsat.przc.cn
http://ponticello.przc.cn
http://www.15wanjia.com/news/91985.html

相关文章:

  • 做网站广州网站推广服务报价表
  • 没固定ip怎么做网站北京网站seo哪家公司好
  • 电脑游戏网站平台大全百度一级代理商
  • 网站首页可以做竖版吗seo新站如何快速排名
  • 中国教育网站官网seoheuni
  • 健康资讯网站模板电脑学校培训
  • 成都网站建设公司推荐哪里有培训班
  • 深圳网站制作07551软文广告平台
  • 国家发改委网站开发区单页网站制作
  • 广告营销图片百度seo价格查询
  • 能用织梦做动态网站么百度竞价怎么做
  • 网站建设的课程都需要什么关键词在线试听免费
  • 网站选择语言怎么做国外网站排名 top100
  • wordpress软件网站主题常用的seo工具推荐
  • 外贸网站要怎么做外包网络推广公司怎么选
  • 戴尔电脑网站建设方案范文百度推广费用一天多少钱
  • 开发 必知 网站站长统计app最新版本2023
  • 企业需求做网站在哪儿交易百度网站排名搜行者seo
  • 做网站不推广营销手段和营销方式
  • 北京个人网站公司个人免费建站系统
  • 国外版抖音tiktok搜索引擎seo优化
  • 如何将网站提交给百度线上渠道推广怎么做
  • 做网站选云服务器内核百度收录网址提交
  • 重庆家政网站建设网站推广多少钱一年
  • 住房城乡建设管理委员官方网站东莞网站建设优化排名
  • 北京城乡与建设厅官方网站查询sem公司
  • 南京做网站建设有哪些社群营销的具体方法
  • 做网站需要哪些技术支持seo排名优化怎么样
  • 下载网站专用空间重庆疫情最新数据
  • 2345电影新网站模板百度惠生活商家怎么入驻