Spring REST API整理

简单练习Spring MVC REST风格的代码 该学习项目完整展示了Spring MVC开发Web应用的流程,包括从控制器到数据访问层的实现,是学习Spring MVC和RESTful Web服务开发的良好案例。 阅读详情

REST (Representational State Transfer),以数据交互为主要内容所设计的系统服务。通过URL来作为资源识别的依据。

Spring MVC充分支持了REST,有两种实现方式:

  1. 协商资源表述,通过ContentNegotiatingViewResolver来向请求方传递合适资源表述形式
  2. 使用HTTP信息转换器,即Message Converter来将资源(即控制器产生的数据)转换为服务与客户端的表述形式,并传递给请求方

第一种模式比较复杂,一般实现REST系统通过第二种方式,更直接更易配置。

使用HTTP信息转换器

在使用HTTP信息转换器的过程中,最重要的两个元素为:

  • 数据(控制器所产生的结果)
  • 消息转换器(message converter)

Spring MVC在配置的时候会默认注册一系列消息转换器,其中最主要的有:

  • MappingJackson2HttpMessageConverter:
    用来转化JSON和类型化的对象或非类型化的HashMap,需要Jackson 2 JSON包
  • Jaxb2RootElementHttpMessageConverter
    用来在XML(text/xml或application/xml)和使用JAXB2注解的对象间互相读取和写入,需要JAXB v2包

只要message converter所依赖的jar包存在于类路径下,这些message converter就会被注册如Spring MVC的上下文中。

Controller产生的数据具体将调用哪一张message converter是由客户请求中的Accept头信息来决定的。

@ResponseBody和@RequestBody

  • @ResponseBody

使用@ResponseBody标注Controller一个具体方法时,程序会告诉Spring MVC跳过视图解析过程,并且去根据请求头中的Accept信息来调用对应的message converter将数据转化客户用需要的资源表达形式。

另外我们可以@RequestMapping注解的produce声明属性里来明确表示一个方法只处理符合某个特定Accept的请求。

  • @RequestBody
    与@ResponseBody相对应的是@RequestBody,该注解用来标注Controller中某个方法的一个参数。Spring MVC会根据客户请求头中的Content-Type来选取具体的message converter将请求中附带的信息转化成具体的对象。

类似地,我们可以在@RequestMapping注解的consumes声明属性里来明确表示一个方法只处理符合某个特定Content-Type的请求。

@RestController

@RestController是用来标注一个controller类的注解,它结合了@Controller与@ResponseBody,表示该controller下的所有方法均为REST API。

提供资源之外的其他类容

一个好的REST API不仅可以向用户提供所需要的资源,还可以提供一些元信息。

  1. @ResponseStatus
    如果仅仅需要提供一个HTTP状态码,那么只需要在响应的方法上面加上@ResponseStatus状态码。例如在@ExceptionHandler处理方法上添加@ResponseStatus(HttpStatus.NOT_FOUND)等。

  2. 控制器方法返回ResponseEntity对象
    控制器方法中可以返回一个ResponseEntity对象,这个对象不仅可以包含资源体,还可以设置返回的HTTP状态码,设置header中的信息等。

@RequestMapping(method=RequestMethod.POST, consumes="application/json")
  @ResponseStatus(HttpStatus.CREATED)
  public ResponseEntity<Spittle> saveSpittle(@RequestBody Spittle spittle, UriComponentsBuilder ucb) {
    Spittle saved = spittleRepository.save(spittle);

    HttpHeaders headers = new HttpHeaders();
    URI locationUri = ucb.path("/spittles/")
        .path(String.valueOf(saved.getId()))
        .build()
        .toUri();
    headers.setLocation(locationUri);

    ResponseEntity<Spittle> responseEntity = new ResponseEntity<Spittle>(saved, headers, HttpStatus.CREATED);
    return responseEntity;
  }
  1. 通过异常处理器来应对错误场景,这样处理器方法就能只关注正常的状况了
@ExceptionHandler(SpittleNotFoundException.class)
  @ResponseStatus(HttpStatus.NOT_FOUND)
  public @ResponseBody Error spittleNotFound(SpittleNotFoundException e) {
    long spittleId = e.getSpittleId();
    return new Error(4, "Spittle [" + spittleId + "] not found");
  }

通过RestTemplate来实现客户端对Rest API调用

不借助RestTemplate来编写客户端(需要使用Apache HTTP Client):

public Profile fetchFacebookProfile(String id){
      try{
          HttpClient client = HttpClients.createDefault();

          HttpGet request = new HttpGet("http://graph.facebook.com/" + id);
          request.setHeader("Accept", "application/json");

          HttpResponse response = client.execute(request);

          HttpEntity entity = response.getEntity();
          ObjectMapper mapper = new ObjectMapper();

          return mapper.readValue(entity.getContent(), Profile.class);
      } catch (IOException e) {
          throw new RuntimeException(e);
      }
  }

通过借助RestTemplate,我们可以避开繁琐的模版式编程。

RestTemplate提供了11个大独立方法,其中10种每个有三个重载,1个有6个重载。

  • delete() – 在特定的URL上对资源执行HTTP DELETE操作
  • exchange() – 在URL上执行特定的HTTP方法,返回包含对象的ResponseEntity,这个对象是从响应体中映射得到的
  • execute() – 在URL上执行特定的HTTP 方法,返回一个从响应体映射得到的对象
  • getForEntity() – 放松一个HTTP GET请求,返回的ResponseEntity包含了响应体所映射成的对象
  • getForObject() – 发送一个HTTP GET请求,返回的请求体将映射为一个对象
  • headForHeaders() – 发送HTTP HEAD请求,返回包含特定资源URL 的HTTP 头
  • optionsForAllow() – 发送HTTP OPTIONS请求,返回对特定URL的Allow头信息
  • postForEntity() – POST数据到一个URL,返回一个对象的ResponseEntity,这个对象是从响应体中映射得到的
  • postForLocation() – POST数据到一个URL,返回新创建资源的URL
  • postForObject() – POST数据到一个URL,返回根据响应体匹配形成的对象
  • put() – PUT资源到特定的URL

getForObject()与getForEntity()唯一区别是一个直接返回根据response而转化的对象,而后者返回的是一个HttpEntity,不仅仅包含转化的对象,还有response中header的信息。

相同的区别也适用postForObject()与postForEntity()。

getForObject()示例:

public Profile fetchFacebookProfile(String id){
    RestTemplate rest = new RestTemplate(); //此处new,也可以通过注入
    return rest.getForObject("http://graph.facebook.com/{id}", Profile.class, id)
}

exchange()方法可以设置Request的header信息,它是最灵活的方法。其实getxxxx或者postxxxx背后调用的都是exchange()方法。

用Python玩转Milvus:从安装SDK到完成第一个向量搜索Demo 本文为Python开发者提供了一份详细的Milvus向量数据库实战指南。文章重点讲解了如何规避版本兼容性陷阱,正确部署Milvus服务端并安装匹配的Python SDK。通过一个电影推荐系统的完整案例,演示了从数据建模、集合创建、向量插入、索引构建到执行混合搜索的全流程,帮助开发者快速上手并完成第一个向量搜索Demo。 阅读详情

相关推荐

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

spring integration之http-rest例子解析

spring integration例子代码下载地址,以及如何导入eclipse并使用maven构建等请参看上一篇: Spring Integration实例代码分析之basic--http 先看一下http-rest例子的readme This sample demonstrates how you can send an HTTP request to a Spring Integr

漫步 1万+

MATLAB安装

Matlab 2016a 安装包及破解教程百度云分享链接: 链接:https://pan.baidu.com/s/1i6BgD8p       密码:17gg   Matlab安装教程: 1、下载文件,得到R2016a_win64.part1.rar、R2016a_win64.part2.rar两部分安装文件和Matlab 2016a Win64 Crack破解文件。 2、解压安装文件(解...

qq_36734094的博客 17万+

构建Spring Restful API请求参数解析

编写Spring restful api接口是一个非常常用的手段来接受http请求服务,那么接收参数的方法以及使用Mock进行测试可以值得探究一下。

懂幸福,爱生活 1万+

Unity线性空间下PSD透明贴图黑边问题:原理分析与三种解决方案

在计算机图形学中,颜色空间转换与Alpha混合是渲染管线的基础环节。伽马空间与线性空间的差异源于显示设备与人眼感知的特性,现代渲染引擎采用线性工作流以实现更真实的光照计算。然而,当图像处理软件(如Photoshop)导出的纹理数据与游戏引擎(如Unity)的预期格式不匹配时,就会引发技术问题,影响视觉保真度与开发效率。具体表现为,在线性空间下进行Alpha Blend混合时,带透明通道的纹理边缘常出现异常黑边或颜色失真,其核心根源在于纹理数据是否经过“预乘”处理与sRGB标记的解读冲突。这一问题的解决对于提

weixin_34198762的博客 380

解密m3u8视频合并:从猫抓插件到本地文件修改全流程

本文详细解析了m3u8视频合并的全流程,特别针对加密视频片段提供了解决方案。从使用猫抓插件捕获m3u8文件地址,到利用N_m3u8DL-CLI工具自动下载、解密并合并ts片段,手把手教你处理AES-128加密等常见问题,最终生成完整的本地MP4文件,适合需要备份或处理流媒体资源的用户。

weixin_29290947的博客 1362

Spring Integration超详细解读

它是一个功能强大的EIP (Enterprise Integration Patterns),即企业集成模式。它是Spring Messaging的扩展,提供了Spring编程模型的扩展,用来支持企业集成模式。它集成了众多功能,是一种便捷的用来在系统之间做消息传递的。Spring Integration的主要特征和功能如下:消息驱动架构:使用消息作为信息的载体,通过订阅和发布消息实现系统之间的通信和集成。使用通道与过滤器:通道负责传输消息,过滤器对消息进行操作与路由。

MengMengDeXiaoJi的博客 6532

嵌入式工程师必看:BLDC电机驱动电路设计全流程(附MOS管选型指南)

本文为嵌入式工程师提供了BLDC电机驱动电路设计的全流程实战指南。文章深入解析了三相全桥逆变电路的核心原理,并重点阐述了功率MOSFET的选型关键参数,如Vds、Rds(on)和Qg。同时,详细介绍了栅极驱动设计、PCB布局布线要点及调试安全步骤,旨在帮助开发者构建稳定高效的BLDC驱动系统。

weixin_29194817的博客 588

spring-integration初探

最近有幸,公司让我研究了spring-integration,对于这个spring出品的功能强大的工具,功能繁多且复杂。写此博客分享一下心得,也为记录一下最近研究这么久的知识点。理解的不够深,如果有错误的地方,希望各位朋友能批评指出。 一、what 首先,什么是spring-integration?研究之初,对这根管道有些迷惑,这是队列?这个activeMQ有啥区别?待研...

Doubletree.lin的博客 6万+

18.EC实战 新建项目工程并配置各个引脚的工作方式(持续更新)

本博文介绍了从零开始新建EC工程及对各个引脚进行了工作模式的初始化配置

qq_30135687的博客 1731

基于深度学习的农作物病虫害检测识别系统:YOLOv8 + UI界面 + 数据集

该系统的目标是使用YOLOv8模型自动检测农作物的病虫害,并通过UI界面提供实时反馈。用户可以通过上传图像,系统会输出图像中是否存在病虫害以及具体种类。数据集准备与处理:收集并准备包含农作物病虫害图像的数据集,并进行标注和数据增强。YOLOv8模型训练:使用YOLOv8训练农作物病虫害检测模型。UI界面设计与开发:开发一个用户友好的界面,支持上传图像并展示检测结果。系统测试与优化:评估模型的准确性、实时性,并对系统进行优化。

YOLO 883

Spring全家桶的深入学习(七):Spring集成REST API服务

文章目录背景REST API服务Spring集成REST API服务用Spring MVC实现用户管理Restful ApiSpring 集成Swagger2API接口进行测试增加用户(HTTP POST请求)查找用户(HTTP GET请求)修改用户(HTTP PUT请求)删除用户(HTTP DELETE请求)小结 背景 《Spring全家桶的深入学习(一):Spring起步》 《Spring全家桶的深入学习(二):基于SpringMVC开发web应用》 《Spring全家桶的深入学习(三):实现数据持久化

我的博客 1208

S7-200 SMART PLC 子程序功能块(阀门控制)

由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 8070

Spring boot 知识整理

内容集成了Spring boot 内容梳理,包括实战搭建一个增删改查的web项目、JPA规范梳理、Mybatis的用法梳理

NovakG_的博客 1490

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

如何快速入门REST API开发:Awesome REST完整指南

REST API作为现代Web开发的核心技术,已成为连接前后端、服务与服务之间的标准方式。本指南将借助**Awesome REST**项目的丰富资源,带你从零基础快速掌握REST API开发的关键知识与实践技巧,让你轻松构建高效、规范的API服务。 ## 一、REST API基础:从概念到核心原则 📚 ### 1.1 什么是REST API? REST(Representational S

gitblog_02184的博客 1193

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

使用Spring REST Docs创建API文档

使用Spring REST Docs创建API文档 (这是在佳都科技实习时导师安排的学习整理的笔记。) PS:可参考官网:https://spring.io/projects/spring-restdocs 1.创建项目 SpringBoot (maven) 首先创建一个SpringBoot的maven工程。创建好基本的controller层。 pom.xml 项目结构 2.加入对Sp...

Ethan的博客 772

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring Boot 3.x Rest API统一异常处理最佳实践

在Spring MVC应用中,要对web表示层所抛出的异常进行捕获处理有多种方式,具体的可参考著名国外Spring技术实战网站baeldung上的相关话题。Spring Boot对Spring MVC应用中抛出的异常以及http错误的捕获处理流程做了统一的封装,最终以特定的`json`结构响应给前端,而我们要做的只是扩展它对json结果的包装方式,以我们想要的结构返回即可。

felix_alone2012的博客 3015

使用Spring MVC 搭建Rest服务

使用Spring MVC 搭建Rest服务 本文由大关总结整理所得,不保证内容的正确性,转载请标明出处!     Rest(Representational State Transfer,表述状态转移),是一种基于Http协议的,能够快速开发网络服务程序,并且提高网络服务系统伸展性的设计和开发方式。Rest的两端可以是不同构的编程和程序运行环境,Rest通过Http协议将通信的两端进行连接,在

xuefeimengli2007的专栏 3921

spring boot api文档_Spring Boot: Spring Doc生成OpenAPI3.0文档

1. 概述公司正好最近在整理项目的文档,且文档对于构建REST API来说是至关重要的。在这篇文章中,我将介绍Spring Doc , 一个基于OpenAPI 3规范简化了Spring Boot 1.x和2.x应用程序的API文档的生成和维护的工具。2. 设置springdoc-openapi如果想让 springdoc-openapi 为我们的API生成标准的 OpenAPI 3 文档, 只需要...

weixin_39628343的博客 885

REST调查资料整理

一、关于REST        REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。  它基于HTTP协议,是一种明确构建在客户端/服务端体系结构上的一种风格。特征如下:  1、网络上的资源都被抽象为资源,这些资源都具有唯一的统一资源标识符(URI:Uniform Resou

ziyifengfei的专栏 1154

【整理】Spring Rest接口开发专题

1 开发技巧 主要参考链接:跟着笨鸟一步一步学习spring开发(二、学习springrest接口开发)http://www.kuqin.com/shuoit/20140615/340586.html理解RESTful架构:《理解RESTful架构》RESTful API 设计指南:http://www.ruanyifeng...

junbaozi的专栏 123

Spring6.1新特性,四种方式调用REST接口(RestClient、WebClient、RestTemplate、HTTP Interface)

SpringFramework为REST调用提供了多种选择:同步的RestClient、非阻塞的WebClient、传统的RestTemplate和注解驱动的HTTPInterface。其中,RestClient和WebClient提供了丰富的定制化选项和简洁的使用方式,官方推荐使用RestClient替换RestTemplate。HTTPInterface允许将HTTP服务定义为Java接口,并支持各种注解。在Spring6.1后,进行REST调用更加简单方便。

wnhyang的博客 2041

Spring Boot后端项目标准化开发:从环境配置到REST API实战

在软件开发中,环境配置与依赖管理是项目稳定运行的基石。其核心原理在于通过标准化工具链和配置策略,确保开发、测试、生产环境的一致性,从而解决'在我机器上能跑'的经典难题。这一实践的技术价值在于提升团队协作效率、增强项目可维护性和可复现性。在Java生态中,Spring Boot框架凭借'约定大于配置'的理念和起步依赖机制,极大地简化了企业级应用的搭建过程。通过合理的多环境配置管理,开发者可以灵活应对不同部署场景的需求。本文以构建一个用户管理REST API为例,详细演示了如何从零开始搭建一个结构清晰的Spri

weixin_31309419的博客 307

spring-rest-service-oauth常见问题解决:从入门到精通的排错清单

spring-rest-service-oauth是一个基于Spring Boot和Spring Security OAuth构建的简单OAuth保护REST服务,在使用过程中可能会遇到各种认证授权相关问题。本文整理了从入门到精通的常见问题解决清单,帮助开发者快速定位并解决问题。 ## 🚫 403权限拒绝错误解决方法 当访问API时遇到403 Forbidden错误,通常是由于权限不足导致的

gitblog_00518的博客 947

将一个datetime的now转换为只有日期的_Spring REST API 从实体到 DTO 的转换

介绍在本文中,我们将处理 Spring 应用的内部实体与客户端外的 DTO(数据传输对象)之间需要进行的转换。模型映射让我们从介绍用于执行的实体到 DTO 转换的主库开始 —— ModelMapper。我们需要将在 pom.xml 中添加如下依赖:然后,我们在 Spring 配置中定义 ModelMapper bean:DTO接下来,让我们来介绍这个双面问题的 DTO 方面 —— Post DTO...

weixin_39853843的博客 88

【知识整理】SpringMVC-REST风格CRUD

一.POST、PUT、DELETE,他们分别对应四种基本操作,GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源。 1.HiddenHttpMethodFiter:浏览器表单只支持GET与POST请求,而DELETE\PUT等method不支持,Spring3.0添加一个过滤器,可以将这些请求转为标准的http方法,使得支持GET\POST\PUT\DELET

qq_19891827的博客 437
上一篇: Spring MVC后台表单校验
下一篇: byte转换至16进制字符串_计算机原/反/补码
AlainGogogo
博客等级 码龄18年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值