首页 > 其他分享 >SpringBoot内容协商机制

SpringBoot内容协商机制

时间:2023-06-22 22:34:46浏览次数:38  
标签:SpringBoot 协商 请求 import 机制 com 客户端

1、是什么?

SpringBoot内容协商机制是一种实现了内容协商(Content Negotiation)的Web服务器,它可以根据客户端请求的不同,将响应返回给客户端。

在传统的Web服务器中,如果客户端请求的URL与服务器上的URL不一致,服务器就会返回一个错误响应,告诉客户端所请求的URL不存在或者不合法。而SpringBoot内容协商机制则可以根据客户端请求的URL和服务器上的规则,动态地将响应返回给客户端,使得客户端可以成功地获取到所请求的数据。

SpringBoot内容协商机制的实现,可以使得服务器的负载减轻,提高服务器的可扩展性和可维护性,同时也可以提高客户端的响应速度和用户体验。

2、能干啥?

SpringBoot内容协商机制可以实现以下功能:

1、根据URL的不同,将响应返回给客户端;
2、动态地将响应返回给客户端,使得客户端可以成功地获取到所请求的数据;
3、提高服务器的负载能力,提高服务器的可扩展性和可维护性;
4、提高客户端的响应速度和用户体验。
5、根据响应头的“Accept”字段的不同,选择不同的处理方式;
6、......
总之,SpringBoot内容协商机制可以帮助Web服务器更好地处理不同来源的数据,提高服务的质量和可靠性。

3、怎么玩?

首先明确一下,SpringBoot默认是以JSON形式处理数据

(1) 基于请求头Accept的内容协商机制(SpringBoot默认开启)

例如:当我们请求头携带Accept:applicatiom/json时服务端会给我们返回json数据
image

当我们请求头携带Accept:applicatiom/xml时服务端会给我们返回xml数据
image

(2) 基于请求参数的内容协商机制(需要手动开启)

例如:发送请求 http://localhost:8080/json?format=json ,优先返回 json 类型数据

当然想要实现基于请求参数的内容协商,需要进行以下几个配置

1.导入依赖

 <dependency>
	 <groupId>com.fasterxml.jackson.dataformat</groupId>
	 <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

2.加入注解

@JacksonXmlRootElement // 支持写出xml文档
@Data
@AllArgsConstructor
public class User {

    private Integer id;
    private String name;
    private String email;
}

3.编写配置

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true # 开启基于请求参数的内容协商功能。 默认参数名:format。 默认此功能不开启
      parameter-name: ly # 指定内容协商时使用的参数名。默认是 format

接下来就会有如下的效果了
json:
image

xml:
image

4、如何自定义内容返回?

例如:增加yaml返回支持,我想实现一个返回yaml格式的内容协商机制

(1) 导入依赖
<dependency>
	<groupId>com.fasterxml.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
(2) 添加配置
spring:
  mvc:
    contentnegotiation:
      favor-parameter: true # 开启基于请求参数的内容协商功能。 默认参数名:format。 默认此功能不开启
      parameter-name: ly # 指定内容协商时使用的参数名。默认是 format
      media-types:
        yaml: application/yaml # 添加一种新的媒体配置
(3) 自定义一个HttpMessageConverter
package com.ly.component;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import com.ly.entity.User;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

/**
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-06-22  20:49
 * @tags 喜欢就去努力的争取
 */
public class YamlHttpMessageConverter extends AbstractHttpMessageConverter {

    private ObjectMapper objectMapper = null;

    public YamlHttpMessageConverter() {
        super(new MediaType("application", "yaml", StandardCharsets.UTF_8));
        var factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);
        this.objectMapper = new ObjectMapper(factory);
    }

    @Override
    protected boolean supports(Class clazz) {
        // 只要是对象类型都支持
        return true;
    }

    /**
     * 读数据的规则
     *
     * @param clazz
     * @param inputMessage
     * @return
     * @throws IOException
     * @throws HttpMessageNotReadableException
     */
    @Override
    protected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        User user = null;
        try (InputStream is = inputMessage.getBody()) {
            ObjectReader objectReader = this.objectMapper.readerFor(clazz);
            user = objectReader.readValue(is, User.class);
            System.out.println("user = " + user);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return user;
    }

    /**
     * 写数据的规则
     *
     * @param methodReturnValue
     * @param outputMessage
     * @throws IOException
     * @throws HttpMessageNotWritableException
     */
    @Override
    protected void writeInternal(Object methodReturnValue, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        try (OutputStream os = outputMessage.getBody()) {
            this.objectMapper.writeValue(os, methodReturnValue);
        }
    }
}

image

标签:SpringBoot,协商,请求,import,机制,com,客户端
From: https://www.cnblogs.com/ybbit/p/17498483.html

相关文章

  • Redis–内存淘汰机制(涉及到过期策略)
    这个博客的内容包括以下几个点:1.redis内存淘汰机制2.若有大量的key需要设置同一时间过期,一般需要注意什么?3.过期键删除策略4.redis如何保证数据都是热点数据一、redis内存淘汰机制1,概念:内存淘汰机制:redis配置文件可以设置maxmemory,内存的最大使用量,达到限度会执行内存淘汰......
  • Springboot敏感字段脱敏的实现思路
    生产环境用户的隐私数据,比如手机号、身份证或者一些账号配置等信息,入库时都要进行不落地脱敏,也就是在进入我们系统时就要实时的脱敏处理。用户数据进入系统,脱敏处理后持久化到数据库,用户查询数据时还要进行反向解密。这种场景一般需要全局处理,那么用AOP切面来实现在适合不过了。......
  • Android - View框架的layout机制
    系统为什么要有layout过程?view框架经过measure之后,可以算出每一个view的尺寸大小,但是如果想要将view绘制的屏幕上,还需要知道view对应的位置信息。除此之外,对一个ViewGroup而言,还需要根据自己特定的layout规则,来正确的计算出子View的绘制位置,已达到正确的layout目的。位置是View相对......
  • SpringBoot - jackson 序列化配置,支持jdk8 时间类型和解决科学计数法
    jdk8时间序列化配置#Copy@ConfigurationpublicclassJacksonConfig{@BeanpublicObjectMapperserializingObjectMapper(){JavaTimeModulejavaTimeModule=newJavaTimeModule();/**序列化配置,针对java8时间**/javaTimeModule.add......
  • Android ANR 实现机制详解
    一ANR概述ANR(ApplicationNotResponding),即应用程序无响应,Android系统指定某些事件需要在规定时间内完成,如果超过预定时间还能未能得到有效响应,就会造成ANR。具体表现为,应用位于前台时,系统会向用户显示一个对话框,如下图所示。用户可以选择“wait”让程序继续运行,也可以选择“......
  • Android binder 机制驱动核心源码详解
    前言应用程序中执行getService()需与ServiceManager通过binder跨进程通信,此过程中会贯穿Framework、Natve层以及Linux内核驱动。binder驱动的整体分层如上图,下面先来宏观的了解下getService()在整个Android系统中的调用栈,ServiceManager本身的获取:与ServiceManage......
  • Android Handler消息机制详解
    在Android中,只有主线程才能更新UI,但是主线程不能进行耗时操作,否则会产生ANR异常,所以常常把耗时操作放到其他子线程进行。如果在子线程中需要更新UI,一般都是通过Handler发送消息,主线接收消息后进行相应的UI逻辑处理。一.什么是HandlerHandler是一个消息分发对象。Handler是Andr......
  • 异常机制​
    异常概念异常是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。设计良好的程序应该在异常发生时提供处理这些不正常事件的方法,使程序不会因为异常的发生而阻断或产生不可预见的结果。Java语言使用异常处理机制为程序提供了异常处理的能力异常分类Java程序运行过程中......
  • InnoDB锁初探(一):锁分类和RR不同场景下的锁机制
    Mysql数据库锁(Innodb)数据库锁是Mysql实现数据一致性的基础之一,是在事务的基础之上,基于MysqlServer层或存储引擎层实现的。锁日志前置条件:setGLOBALinnodb_status_output=ON;setGLOBALinnodb_status_output_locks=ON;查看语句:showengineinnodbstatus\G;锁分类......
  • springboot 默认配置的线程池
     线程池的大小通常都是我们比较关注的,SpringBoot会为系统做默认配置。如果不清楚SpringBoot默认配置的线程池的大小的话,容易线上踩坑。最近碰到一个生产问题,线上部署6台机器,定时任务A,B都在17:00执行,执行时会各自先获取分布式锁。(服务器时间是一致的)理论上是可以做到同......