幂等

PUT

初始状态:0

修改状态:1 * N

最终状态:1

DELETE

初始状态:1

修改状态:0 * N

最终状态:0

非幂等

POST

初始状态:1

修改状态:1 + 1 =2

N次修改: 1+ N = N+1

最终状态:N+1

幂等/非幂等 依赖于服务端实现,这种方式是一种契约

#自描述消息

> Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

第一优先顺序:text/html -> application/xhtml+xml -> application/xml

第二优先顺序:image/webp -> image/apng

《Spring Boot 编程思想》

学习源码的路径:

@EnableWebMvc

​ DelegatingWebMvcConfiguration

​ WebMvcConfigurationSupport#addDefaultHttpMessageConverters

所有的 HTTP 自描述消息处理器均在 messageConverters(类型:`HttpMessageConverter`),这个集合会传递到 RequestMappingHandlerAdapter,最终控制写出。

messageConverters,其中包含很多自描述消息类型的处理,比如 JSON、XML、TEXT等等

以 application/json 为例,Spring Boot 中默认使用 Jackson2 序列化方式,其中媒体类型:application/json,它的处理类 MappingJackson2HttpMessageConverter,提供两类方法:

1. 读read* :通过 HTTP 请求内容转化成对应的 Bean
2. 写write*: 通过 Bean 序列化成对应文本内容作为响应内容

问题:为什么第一次是JSON,后来怎加了 XML 依赖,又变成了 XML 内用输出

回答:Spring Boot 应用默认没有增加XML 处理器(HttpMessageConverter)实现,所以最后采用轮训的方式去逐一尝试是否可以 canWrite(POJO) ,如果返回 true,说明可以序列化该 POJO 对象,那么 Jackson 2 恰好能处理,那么Jackson 输出了。

问题:当 Accept 请求头未被制定时,为什么还是 JSON 来处理

回答:这个依赖于 messageConverters 的插入顺序。

问题:优先级是默认的是吧 可以修改吗

回答:是可以调整的,通过extendMessageConverters 方法调整

### 扩展自描述消息

Person

JSON 格式(application/json)

```json
{
"id":1,
"name":"小马哥"
}
```

XML 格式(application/xml)

```xml
<Person>
<id>1</id>
<name>小马哥</name>
</Person>
```

Properties 格式(application/properties+person)

(需要扩展)

```properties
person.id = 1
person.name = 小马哥
```

1. 实现 AbstractHttpMessageConverter 抽象类
1. supports 方法:是否支持当前POJO类型
2. readInternal 方法:读取 HTTP 请求中的内容,并且转化成相应的POJO对象(通过 Properties 内容转化成 JSON)
3. writeInternal 方法:将 POJO 的内容序列化成文本内容(Properties格式),最终输出到 HTTP 响应中(通过 JSON 内容转化成 Properties )

* @RequestMappng 中的 consumes 对应 请求头 “Content-Type”
* @RequestMappng 中的 produces 对应 请求头 “Accept”

HttpMessageConverter 执行逻辑:

* 读操作:尝试是否能读取,canRead 方法去尝试,如果返回 true 下一步执行 read
* 写操作:尝试是否能写入,canWrite 方法去尝试,如果返回 true 下一步执行 write

spring rest小马哥的更多相关文章

  1. 小马哥讲Spring栈核心编程思想 Spring IoC+Bean+Framework

    小马哥出手的Spring栈核心编程思想课程,可以说是非常专业和权威的Spring课程.课程主要的方向与核心是Spring Framework总览,带领同学们重新认识重新认识IoC,Spring IoC ...

  2. 小马哥-Java 微服务实践 - Spring Boot 系列-01Java 微服务实践 - Spring Boot 系列(一)初体验

    课程github地址 https://github.com/mercyblitz/segmentfault-lessons 传统的web应用架构.微服务是一种架构.不限定什么语言 单体应用和微服务的对 ...

  3. Spring Cloud Alibaba到底坑不坑?

    之前我发过一篇<说说我为什么看好Spring Cloud Alibaba>,然后这两天有网友给我转了这篇文章<坑爹项目spring-cloud-alibaba,我们也来一个>, ...

  4. Spring Boot 系列 - WebSocket 简单使用

    在实现消息推送的项目中往往需要WebSocket,以下简单讲解在Spring boot 中使用 WebSocket. 1.pom.xml 中引入 spring-boot-starter-websock ...

  5. Spring Framework 组件注册 之 @Component

    Spring Framework 组件注册 之 @Component 写在前面 在spring大行其道的今天,对于spring的使用和掌握乃是不可缺少的必备技能.但是spring的整个体系尤为庞大,对 ...

  6. Spring 注解编程之 AnnotationMetadata

    在上篇文章 Spring 注解编程之模式注解 中我们讲到 Spring 模式注解底层原理,依靠 AnnotationMetadata 接口判断是否存在指定元注解. 这篇文章我们主要深入 Annotat ...

  7. [Spring cloud 一步步实现广告系统] 22. 广告系统回顾总结

    到目前为止,我们整个初级广告检索系统就初步开发完成了,我们来整体回顾一下我们的广告系统. 整个广告系统编码结构如下: mscx-ad 父模块 主要是为了方便我们项目的统一管理 mscx-ad-db 这 ...

  8. 厉害了,Spring Cloud Alibaba 发布 GA 版本!

    ? 小马哥 & Josh Long ? 喜欢写一首诗一般的代码,更喜欢和你共同 code review,英雄的相惜,犹如时间沉淀下来的对话,历久方弥新. 相见如故,@杭州. 4 月 18 日, ...

  9. 曹工说Spring Boot源码(11)-- context:component-scan,你真的会用吗(这次来说说它的奇技淫巧)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

随机推荐

  1. Flutter随笔(二)——使用Flutter Web + Docker + Nginx打造一个简单的Web项目

    前言 Flutter作为一个跨平台UI框架,功能十分强大,仅用一套代码便能编译出Android.iOS.Web.windows.macOS.Windows.Linux等平台上的应用,各平台应用体验高度 ...

  2. 苹果的最新MacbookPro,炸到你了么?

    一 苹果秋季发布会如期而至.我不是一个标准的果粉.但是我今年用上了macbook pro m1,最期待的就是新款的搭载了M1X的Macbook. 苹果官方也放出了要炸翻全场的宣传语... 这次发布会围 ...

  3. python的参数传递是值传递还是引用传递??

    函数参数传递机制,传值和引用的是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传递. 值传递(pa ...

  4. 【数据结构与算法Python版学习笔记】递归(Recursion)——优化问题与策略

    分治策略:解决问题的典型策略,分而治之 将问题分为若干更小规模的部分 通过解决每一个小规模部分问题,并将结果汇总得到原问题的解 递归算法与分治策略 递归三定律 体现了分支策略 应用相当广泛 排序 查找 ...

  5. spring cloud feign的基本使用

    在上一节,我们学会了如何使用ribbon进行来进行服务之间的调用,但是那种需要通过RestTemplate来进行调用而且当参数比较多时,使用起来就比较麻烦.那么有没有一种调用远程方法(别的服务)就像调 ...

  6. Noip模拟12 2021.7.12

    T1 interval 亏得昨天晚上改掉了T3并且理解了单调栈,今天一扫这题目就知道要用啥了. 先预处理出以a[i]为最大值的最大左右区间.然后再将a[i]取%!!!是的,要不然会影响单调栈的使用.. ...

  7. [火星补锅] 非确定性有穷状态决策自动机练习题Vol.1 T3 第K大区间 题解

    前言: 老火星人了 解析: 很妙的二分题.如果没想到二分答案.. 很容易想到尝试用双指针扫一下,看看能不能统计答案. 首先,tail指针右移时很好处理,因为tail指针右移对区间最大值的影响之可能作用 ...

  8. Manacher(马拉车)

    Able was I ere I saw Elba.     ----Napoléon Bonaparte(拿破仑) 一.回文串&回文子串   这个很好理解. 如果一个字符串正着读和反着读是一 ...

  9. [转]浅谈电路设计中应用DDR3处理缓存问题

    本文转自:浅谈电路设计中应用DDR3处理缓存问题_若海人生的专栏-CSDN博客 DDR系列SDRAM存储芯片的高速率.高集成度和低成本使其理所当然成为存储芯片中的一霸.在PC和消费电子领域自是如此,它 ...

  10. Python import cStringIO ImportError: No module named 'cStringIO'

    From Python 3.0 changelog; The StringIO and cStringIO modules are gone. Instead, import the io modul ...