幂等

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. SpringBoot入门05-全局配置文件

    springboot全局配置文件作用是设置或修改默认设置 springboot全局配置文件有下面两种方式 application.xml配置文件 示例 server.port=8088 server. ...

  2. Java多线程编程实战指南 设计模式 读书笔记

    线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...

  3. 海信A6/A6L A7Pro/CC A5PRO/A5PRO CC 安装gms google service指南

    用过海信双面屏或者eink手机的朋友都知道,海信手机就是死活安装不了谷歌全家桶,因为海信的领导说跟谷歌有协议不能安装谷歌框架(还说后期google审核坚决不给安装,人家其他ov mui都可以安装).不 ...

  4. python使用Django框架开发简单项目

    一. (1)使用idea生成一个python项目,安装Django框架: pip install django==1.8.2 (2)初始化项目: django-admin startproject x ...

  5. 【c++ Prime 学习笔记】第8章 IO库

    C++语言不直接处理输入输出,而是通过标准库中的一组类来处理IO 1.2节介绍的IO库: istream(输入流)类型,提供输入 ostream(输出流)类型,提供输出 cin,是istream对象, ...

  6. js--数组的 fill() 填充方法详解

    前言 我们知道了很多了初始化数组的方法,但是初始化数组之后,数组中的每一项元素默认为 empty 空位占位,如何对数组这些空位添加默认的元素,ES6提供了 fill() 方法实现这一操作.本文总结数组 ...

  7. 设计的MOS管三极管简单开关电路驱动能力不够2

    设计的MOS管三极管简单开关电路驱动能力不够 [复制链接]     lxizj 9 主题 454 帖子 1783 积分 四级会员(40) 积分 1783 发消息 16#   发表于 2012-4-23 ...

  8. HBase的安装与部署

    一.部署前置环境 先部署分布式的高可用版的Hadoop,即ZooKeeper+Hadoop. https://www.cnblogs.com/live41/p/15483192.html * 部署的服 ...

  9. PCIE学习笔记--PCIe错误源详解(二)

    转载地址:http://blog.chinaaet.com/justlxy/p/5100057799 这篇文章主要介绍事务(Transaction)错误.链路流量控制(Link Flow Contro ...

  10. 51nod_1001 数组中和等于K的数对(二分)

    题意: 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9 ...