Restful风格的编程

news/2024/5/7 0:58:06/文章来源:https://blog.csdn.net/weixin_51423778/article/details/127034272

Restful风格的编程

  • 1、 Restful简介
  • 2、查询用户以及用户详情
    • 2.1常用注解
    • 2.2查询用户详情
  • 3、处理创建请求
    • 3.1@RequestBody注解
      • 3.1.1用途
      • 3.1.2语法规范
    • 3.2日期类型的处理
    • 3.3BindingResult
  • 4、用户信息修改与删除
    • 4.1用户信息修改
    • 4.2案例
      • 前端界面
      • 后端控制器

1、 Restful简介

Restful比较热门,,Spring的微服务是基于Restful风格搭建的框架。
Restful有一下几个特点:

  1. 使用URL描述资源。
  2. 使用HTTP方法描述行为,使用HTTP状态码来表示不同的结果。
  3. 使用JSON交互数据。
  4. Restful只是一种风格,不是强制标准。

2、查询用户以及用户详情

最简单的,最常用的GET请求,用于查询全部数据或者其中一条数据的详情。

2.1常用注解

常用注解作用
@RestController表明此tController 提供的是Restful服务
@RequestMapping将URL映射到Java
@RequestParam映射请求参数到Java上的参数
@PageableDefault指定分页参数的默认值

2.2查询用户详情

@RequestMapping(value="/manage", method= {RequestMethod.GET})public String list(String userId,Map<String,Object> map) {if(userId==""||userId==null) {map.put("userList", userService.getUserList());}else {map.put("userList",userService.getUserById(Integer.parseInt(userId)));}return "user/list";}

3、处理创建请求

3.1@RequestBody注解

3.1.1用途

用于接收前端传递给后端的json字符串中的数据。(处理json格式的数据)
@RequestBody用来接收前端传递给后端的json字符串中的数据,GET方式的请求一般通过URL中携带key-value参数,而@RequestBody接收的是请求体中的数据(json格式的数据,只有请求体中能保存json),所以使用@RequestBody接收数据的时候必须是POST方式等方式。
@RequestBody与@RequestParam()可以同时使用,但@RequestBody最多只能有一个,而@RequestParam()可以多个。

3.1.2语法规范

(@RequestBody Map map)
(@RequestBody Object object)

(@RequestBody Map map)先对简单,将json解析成Map形式的key-value对,直接通过map.get(“KeyName”)就能拿到值了
(@RequestBody Object object) 通过json字符串中的key来匹配对应实体类的属性如果匹配一致且json中的该key对应的值符合实体类的对应属性的类型要求时,会调用实体类的setter方法将值注入到该属性。
例如

public Result deleteBookById(@RequestBody HashMap<String, String> map) {this.bookService.deleteBookById(Long.parseLong(map.get("id")));return Result.createWithSuccessMessage();}public Result updateBookById(@RequestBody Book book){Book record = this.bookService.updateBookById(book);return Result.createWithModel(record);}

注意:

在(@RequestBody Object object)中,前端POST过来的数据会通过反序列数据到实体类中,并且在反序列的过程中会进行类型的转换。
在json中应该用null来代表空值,如果是"“(空字符串)会判断为空串,如果实体类属性是String类型的,那么接受到的就是”",如果实现类属性类型是Integer、Double等类型,那么接收到的就是null。

{name:"",age:null
}

(@RequestBody Object object)内部是通过传递过来的数据中的Key寻找setter方法,有则调用,无则不作任何操作(其实可以设计)。
如果通过Key匹配到setter方法,但是Value无法转换为对应的实例类属性的类型时,抛出异常。

3.2日期类型的处理

前端传入日期格式: yyyy-MM-dd HH:mm:ss,例如:2018-07-09 12:55:12(不使用时间戳,前后双方联调时查看起来更加友好)

后端返回日期格式: yyyy-MM-dd HH:mm:ss,例如:2018-07-09 12:55:12(不使用时间戳,前后双方联调时查看起来更加友好)

后端json序列化、反序列化框架: 定义任何一种高效的json工具都行,例如:Fastjson、Gson、Jackson lib

序列化、反序列化日期格式规范: pattern=”yyyy-MM-dd HH:mm:ss”,timezone = “GMT+8”,除特出场景可以使用pattern=”yyyy-MM-dd”,timezone = “GMT+8”

不要随意自定义convert处理日期格式以及其他特殊格式转换,应该交由基础框架组或架构组统一在框架层面解决,对业务开发透明,或者在有些小公司由Leader或高开来担当。

3.3BindingResult

	/** 添加用户,使用@RequestBody将请求体映射到Action方法参数中* 使用@Valid注解验证请求参数的合法性* 使用BindingResult处理校验结果* @param user* @param result* @return*/@PostMapping("/user")public User create(@Valid @RequestBody User user, BindingResult result){if(result.hasErrors()){result.getAllErrors().stream().forEach(error -> {FieldError fieldError = (FieldError)error;String message = fieldError.getField() + " " + error.getDefaultMessage();System.out.println(message);});return null;}System.out.println(user.toString());user.setId(5l);return user;}

4、用户信息修改与删除

PUT和DELETE并不复杂,大家也熟悉,用于对后台数据的更新和删除。

4.1用户信息修改

对资源更新的请求方法通常是是PUT,但有时候也可能是POST。那么问题来了,都是更新资源区别在哪里?

PUTPOST
在HTTP中PUT被定义为幂等的请求方法而POST则不是
操作是作用于一个具体资源之上作用于一个集合资源之上
URL在客户端确定使用PUTURL在服务端确定使用POST

比较直观的是资源URL的不同
——

4.2案例

前端界面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><script src="../js/jquery.min.js"></script><script>$(function () {// 查询所有$('#btn1').click(function () {$.get('/employees', function (data) {console.log(data);});});// 查询一个$('#btn2').click(function () {$.get('/employees/10', function (data) {console.log(data);});});// 添加$('#btn3').click(function () {$.post('/employees', "id=11", function (data) {console.log(data);});});// 修改$('#btn4').click(function () {$.ajax({url: "/employees",type: "PUT",data: {id: 1, name: "小肥羊", age: 10},success: function (data) {console.log(data);}});});// 删除$('#btn5').click(function () {$.ajax({url: "/employees/13",type: "DELETE",data: {id: 1},success: function (data) {console.log(data);}});});});</script>
</head>
<body>
<button id="btn1">查询所有</button>
<button id="btn2">查询一个</button>
<button id="btn3">添加</button>
<button id="btn4">修改</button>
<button id="btn5">删除</button>
</body>
</html>

后端控制器

package com.yy.web.controller;import com.yy.domain.Employee;
import com.yy.util.JsonResult;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.web.bind.annotation.*;import java.util.Arrays;
import java.util.List;/*** @program: restful-demo* @ClassName: EmployeeController* @description:* @author: YanYang* @create: 2021-06-23 15:04**/
@RestController
@RequestMapping("employees")
public class EmployeeController {/*** 2个接口设计都是用相同资源,相同请求方法,此时 SpringMVC 无法识别,* 认为是同一方法,报错:Ambiguous mapping. [模糊映射]** RESTful 解决方案:使用 参数路径 方式*      具体实现:将参数作为请求映射路径一部分,[参与映射路径区分]*      比如:查询指定 id 的员工信息接口设计*      @RequestMapping(value = "/employees/{id}", method = RequestMethod.GET)*      其中 "/employees/{id}" 参数路径,{id} 就是路径参数**      访问该接口时:http:localhost:8080/employees/1  其中 1 是 id 参数*      接口接收路径参数:使用 @PathVariable,表示将参数路径上的参数解析,并赋值给指定变量*      如果路径参数与变量名不一致,使用 @PathVariable("eid")明确指定**/// 查询所有(数据是模拟的)
//    @RequestMapping(value = "/employees", method = RequestMethod.GET)@GetMappingpublic List<Employee> list() {return Arrays.asList(new Employee(1L,"小肥羊", 10), new Employee(2L, "熊大", 11));}// 查询单个(数据是模拟的)
//    @RequestMapping(value = "/employees/{id}", method = RequestMethod.GET)@GetMapping("/{eid}")public Employee queryById(@PathVariable("eid") Long id) {System.out.println("查询单个 = " + id);return new Employee(3L, "熊二", 8);}// 添加(数据是模拟的)
//    @RequestMapping(value = "/employees", method = RequestMethod.POST)@PostMappingpublic Employee add(@ModelAttribute("employee") Employee employee) {System.out.println("添加 = " + employee.getId());return employee;}// 修改(数据是模拟的)
//    @RequestMapping(value = "/employees", method = RequestMethod.PUT)@PutMappingpublic Employee update(@ModelAttribute("employee") Employee employee) {System.out.println("修改 = " + employee.getId());employee.setId(employee.getId());employee.setName(employee.getName());employee.setAge(employee.getAge());return employee;}// 删除(数据是模拟的)
//    @RequestMapping(value = "/employees/{id}", method = RequestMethod.DELETE)@DeleteMapping("/{id}")public String delete(@PathVariable Long id) {System.out.println("删除 = " + id);if (id != null && 1 == id) {return "删除成功";}return "删除失败";}
}

在这里插入图片描述
求三连!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_223754.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML爱心代码 | 一起体验理工男的极致浪漫(电视剧男主同款)

写在前面 大家好&#xff0c;我是陈橘又青&#xff0c;今天中午刷微博&#xff0c;看到最近《点燃我温暖你》中男主角——理工男李峋的爱心代码撩到了无数人&#xff0c;于是把代码开源分享给大家。 文章目录写在前面运行示例完整代码保姆级运行教学添加背景图片修改爱心颜色运…

工业物联网解决方案:PLC数据上云

智能制造已成为工业发展的趋势&#xff0c;以PLC为代表的工控系统时制造业转型的核心&#xff0c;通过对其进行数据采集&#xff0c;可以实现远程监控&#xff0c;及时管理和维护。随着通信技术的发展&#xff0c;PLC的数据上云逐渐成为企业的新需求&#xff0c;可以更好远程监…

国际物流详解:国际物流有哪些特点?国际物流有哪些优势?

随着互联网信息的快速发展&#xff0c;越来越多的人通过通关网络接触到了国外世界&#xff0c;随之而来的采购购物潮也使得国内国际物流业发展迅速。那么国际物流有哪些特点?又有哪些优势呢?下面我们一起来详细了解一下国际物流主要特点和优势吧!一、国际物流是什么 在了解国…

oracle实验七(安全管理)

&#xff08;实验目的及要求&#xff09; 实验目的 &#xff08;1&#xff09; 掌握 Oracle 数据库安全控制的实现。 &#xff08;2&#xff09; 掌握 Oracle 数据库用户管理。 &#xff08;3&#xff09; 掌握 Oracle 数据库权限管理。 &#xff08;4&#xff09; 掌握 Oracle…

计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash) 代码实现 与举例

MSE&#xff08;Mean Squared Error&#xff09;均方误差 MSE公式 MSE 计算模型的预测 Ŷ 与真实标签 Y 的接近程度。公式表示为&#xff1a; 对于两个mn的单通道图像I和K&#xff0c;它们的均方误差可定义为&#xff1a; 优点&#xff1a;MSE的函数曲线光滑、连续&#xff…

什么是HTML?

关于每篇博文的浪漫主义 【4k】镰仓的灰色与青 | irkyar | sonya74【【4k】镰仓的灰色与青 | irkyar | sonya74】 https://www.bilibili.com/video/BV14G411A7eX/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 网页 1.1什么是网页 网站是指在因特网…

排列(全排,前一个,下一个)

目录 一&#xff0c; 前一个排列&#xff08;字典序更大的最近的一个排列&#xff09; 1.1 底层实现 1.2 prev_permulation() 二&#xff0c;下一个排列&#xff08;字典序更小的最近的一个排列&#xff09; 1.1 底层实现 1.2 next_permulation() 三&#xff0c;全排列 …

C++基础——函数重载

目录 一.函数 重载的三种形式&#xff1a; 1.参数个数不同的重载函数 2. 类型上的不同重载函数 3. 类型顺序上的不同重载函数 二.函数重载缺省参数 返回值不同&#xff0c;能不能构成函数重载&#xff1f; 重载&#xff1a; 重新赋予意义&#xff0c;可以认为是一词多义&…

AssetBundle检测服务使用指南

熟悉UWA的老朋友都知道&#xff0c;UWA有个经典的免费SaaS服务 - 「在线AssetBundle检测」&#xff0c;可以检测包括纹理、网格、动画片段、材质等项目资源使用情况和具体冗余程度。通过快速查看特定的AssetBundle、资源文件和脚本信息&#xff0c;以及AssetBundle和资源之间的…

JAVA线程池 -clt设计与分析

1. 前言 ctl 是线程池源码中常常用到的一个变量。它的主要作用是记录线程池的生命周期状态和当前工作的线程数。作者通过巧妙的设计&#xff0c;将一个整型变量按二进制位分成两部分&#xff0c;分别表示两个信息。 2. 源码解析 源码部分 /*** The main pool control state,…

Pytorch学习笔记6——时间序列RNN

Pytorch学习笔记6——时间序列 判断态度的二分类问题&#xff1a; 对于长句子不适合&#xff0c;因此需要权值共享&#xff1a; 对于某一层&#xff1a; 上一步输出作为下一步输入&#xff0c;存储语境信息&#xff1a; 自我更新语境信息ht ht是最后一次送入得到的m…

提出创意的方法

提出创意的方法 “我不擅长想出创意。” 你是否经常对自己说这样的话? 在公司的会议和学校的集体工作中总是提不出好点子。 即使提出了很多创意&#xff0c;也会偏向于相同的创意&#xff0c;无法得出有趣的提案。 为了打破这样的状况&#xff0c;这次的博客介绍创造性想法…

排序算法:插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序

排序算法相关总结&#xff0c;涉及的排序算法有&#xff1a;插入排序、冒泡排序、选择排序、希尔排序、堆排序、快速排序。 这里写目录标题1.插入排序2.冒泡排序3.选择排序4.希尔排序5.堆排序6.快速排序总结稳定性概念: 假定在待排序的记录序列中&#xff0c;存在多个具有相同的…

缓冲区的管理

文章目录什么是缓冲区&#xff1f;有什么作用&#xff1f;单缓冲单缓冲和双缓冲通信时的区别循环缓冲区缓冲池什么是缓冲区&#xff1f;有什么作用&#xff1f; 缓冲区是一个存取区域&#xff0c;可以由专门的硬件寄存器组成&#xff0c;也可以用内存作为缓冲区&#xff0c;本节…

Python中的几种推导式用法,先收藏再说......

嗨害大家好鸭&#xff01;我是小熊猫❤ 今天我们来整点非常干的干货&#xff1a; 源码、资料电子书点击此处 Python 推导式是一种独特的数据处理方式&#xff0c; 可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式&#xff1a; 列表(li…

D. Maximum Sum on Even Positions(最大连续字段和)

Problem - 1373D - Codeforces 题意: 给你一个由n个整数组成的数组a。数组的索引从零开始&#xff08;即第一个元素是a0&#xff0c;第二个是a1&#xff0c;以此类推&#xff09;。 你最多可以扭转这个数组的一个子数组&#xff08;连续子段&#xff09;。回顾一下&#xff0c…

[附源码]计算机毕业设计JAVAjsp不回头药店药品管理系统

[附源码]计算机毕业设计JAVAjsp不回头药店药品管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SS…

【Prometheus】什么是prometheus?prometheus简介

本文目录 一、什么是prometheus&#xff1f; 二、体系结构概述 三、适用场景 四、不适用的场景 一、什么是prometheus&#xff1f; Prometheus官网 Prometheus开源代码 From metrics to insight Power your metrics and alerting with the leading open-source monitoring…

随想录一刷Day48——动态规划

文章目录Day48_动态规划29. 打家劫舍30. 打家劫舍 II31. 打家劫舍 IIIDay48_动态规划 29. 打家劫舍 198. 打家劫舍 思路&#xff1a; 题目的关键是&#xff0c;不能偷相邻的两个屋子&#xff0c;即只能偷上一个屋子不偷当前屋子&#xff0c;或者不偷上一个屋子偷当前屋子。 d…

LeetCode刷题(python版)——Topic57插入区间

一、题设 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表。 在列表中插入一个新的区间&#xff0c;你需要确保列表中的区间仍然有序且不重叠&#xff08;如果有必要的话&#xff0c;可以合并区间&#xff09;。 示例 1&#xff1a; 输入&#xff1a;interva…