java ranger rest_使用REST

使用Spring MVC开发Web应用程序的主要工作就是编写Controller逻辑。在Web应用中,除了需要使用MVC给用户显示页面外,还有一类API接口,我们称之为REST,通常输入输出都是JSON,便于第三方调用或者使用页面JavaScript与之交互。

直接在Controller中处理JSON是可以的,因为Spring MVC的@GetMapping和@PostMapping都支持指定输入和输出的格式。如果我们想接收JSON,输出JSON,那么可以这样写:

@PostMapping(value = "/rest",

consumes = "application/json;charset=UTF-8",

produces = "application/json;charset=UTF-8")

@ResponseBody

public String rest(@RequestBody User user) {

return "{\"restSupport\":true}";

}

对应的Maven工程需要加入Jackson这个依赖:com.fasterxml.jackson.core:jackson-databind:2.11.0

注意到@PostMapping使用consumes声明能接收的类型,使用produces声明输出的类型,并且额外加了@ResponseBody表示返回的String无需额外处理,直接作为输出内容写入HttpServletResponse。输入的JSON则根据注解@RequestBody直接被Spring反序列化为User这个JavaBean。

使用curl命令测试一下:

$ curl -v -H "Content-Type: application/json" -d '{"email":"bob@example.com"}' http://localhost:8080/rest

> POST /rest HTTP/1.1

> Host: localhost:8080

> User-Agent: curl/7.64.1

> Accept: */*

> Content-Type: application/json

> Content-Length: 27

>

< HTTP/1.1 200

< Content-Type: application/json;charset=utf-8

< Content-Length: 20

< Date: Sun, 10 May 2020 09:56:01 GMT

<

{"restSupport":true}

输出正是我们写入的字符串。

直接用Spring的Controller配合一大堆注解写REST太麻烦了,因此,Spring还额外提供了一个@RestController注解,使用@RestController替代@Controller后,每个方法自动变成API接口方法。我们还是以实际代码举例,编写ApiController如下:

@RestController

@RequestMapping("/api")

public class ApiController {

@Autowired

UserService userService;

@GetMapping("/users")

public List users() {

return userService.getUsers();

}

@GetMapping("/users/{id}")

public User user(@PathVariable("id") long id) {

return userService.getUserById(id);

}

@PostMapping("/signin")

public Map signin(@RequestBody SignInRequest signinRequest) {

try {

User user = userService.signin(signinRequest.email, signinRequest.password);

return Map.of("user", user);

} catch (Exception e) {

return Map.of("error", "SIGNIN_FAILED", "message", e.getMessage());

}

}

public static class SignInRequest {

public String email;

public String password;

}

}

编写REST接口只需要定义@RestController,然后,每个方法都是一个API接口,输入和输出只要能被Jackson序列化或反序列化为JSON就没有问题。我们用浏览器测试GET请求,可直接显示JSON响应:

56f4a8b332c2548b18925fce600297dc.png

要测试POST请求,可以用curl命令:

$ curl -v -H "Content-Type: application/json" -d '{"email":"bob@example.com","password":"bob123"}' http://localhost:8080/api/signin

> POST /api/signin HTTP/1.1

> Host: localhost:8080

> User-Agent: curl/7.64.1

> Accept: */*

> Content-Type: application/json

> Content-Length: 47

>

< HTTP/1.1 200

< Content-Type: application/json

< Transfer-Encoding: chunked

< Date: Sun, 10 May 2020 08:14:13 GMT

<

{"user":{"id":1,"email":"bob@example.com","password":"bob123","name":"Bob",...

注意观察上述JSON的输出,User能被正确地序列化为JSON,但暴露了password属性,这是我们不期望的。要避免输出password属性,可以把User复制到另一个UserBean对象,该对象只持有必要的属性,但这样做比较繁琐。另一种简单的方法是直接在User的password属性定义处加上@JsonIgnore表示完全忽略该属性:

public class User {

...

@JsonIgnore

public String getPassword() {

return password;

}

...

}

但是这样一来,如果写一个register(User user)方法,那么该方法的User对象也拿不到注册时用户传入的密码了。如果要允许输入password,但不允许输出password,即在JSON序列化和反序列化时,允许写属性,禁用读属性,可以更精细地控制如下:

public class User {

...

@JsonProperty(access = Access.WRITE_ONLY)

public String getPassword() {

return password;

}

...

}

同样的,可以使用@JsonProperty(access = Access.READ_ONLY)允许输出,不允许输入。

练习

小结

使用@RestController可以方便地编写REST服务,Spring默认使用JSON作为输入和输出。

要控制序列化和反序列化,可以使用Jackson提供的@JsonIgnore和@JsonProperty注解。

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

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

相关文章

JDK安装与环境变量配置

本文介绍JDK的安装与环境变量配置。 工具/原料 JDK1.7.0 WIN7 方法/步骤 安装JDK 选择安装目录 安装过程中会出现两次 安装提示 。第一次是安装 jdk &#xff0c;第二次是安装 jre 。建议两个都安装在同一个java文件夹中的不同文件夹中。&#xff08;不能都安装在java文件夹的…

第一人称视角获得运动方向和视角的夹角

1. GetVelocity获得速度的vector 2. 使用RotationFromXVector和速度的vector得到世界坐标系里速度向量和世界坐标系X轴的夹角 虽然&#xff0c;RotationFromXVector返回的是一个rotation&#xff0c;但实际上只有Yaw值有效&#xff0c;因为Yaw(围绕Z轴的偏转角) 即为速度vecto…

java中CardLayout的使用方法

import javax.swing.*;import java.awt.*; import java.awt.event.*;public class Card extends JFrame{/** JFrame的布局管理器是BorderLayout*/JPanel p;//位于中心区域的面板JButton b1,b2,b3,b4;//位于南部区域的四个按钮JLabel l1,l2,l3,l4;CardLayout c;//设置面板p的布局…

深入浅出UE4网络

UE4中的官方文档结构比较混乱&#xff0c;且有部分错误&#xff0c;不方便学习。笔者试图通过本文&#xff0c;整理出一篇关于UE4网络的文章&#xff0c;方便朋友们对UE4中的网络同步部分的认识&#xff0c;并有进一步理解。如有讲得不清楚明白的地方&#xff0c;还望批评指正。…

java载屁股针_以前常打的“屁股针”,为何现在很少见了?医生告诉你真实原因...

打屁股针应该是每个人的童年噩梦&#xff0c;还记得小时候到医院打针&#xff0c;医生的手还没碰到裤子&#xff0c;就感觉屁股发麻&#xff0c;忍不住拔腿就跑&#xff0c;最终还是被家长逮住&#xff0c;夹在大腿间固定住&#xff0c;防止逃跑&#xff0c;于是在哭喊声中迎来…

Windows中查找文件被何进程使用

这篇文章记录在对文件/文件夹删除、更改&#xff0c;移动时&#xff0c;Windows弹窗提示正在被某程序使用&#xff0c;但又不给出进程名的问题。 方法一、 在任务管理器中&#xff0c;切换到性能项&#xff0c;有一个资源管理器&#xff0c;如下&#xff1a; 进入资源管理器&am…

UE4 多人联机显示每个人的playid

目的&#xff1a;在多人联机模式下&#xff0c;在每个pawn的上方显示textrender&#xff0c;并且在textrender里显示每个pawn的playerid 下面以一个listen server和两个client的方式测试。 1. 创建一个带有textrender的actor&#xff0c;并且勾选其replicated开关 2. 在Chara…

TSubclassOf

在蓝图或C层面调用SpawnActor创建一个actor对象&#xff0c;或者调用SpawnActorDeferred 延迟创建一个actor对象时&#xff0c;都需要一个class类型的参数。 如果在C层面&#xff0c;对象类型是我们自己在蓝图里做的蓝图类&#xff0c;那么C层面需要得到蓝图类型。做法如下&am…

蓝图中实现人物移动1

从Character继承一个蓝图类并编写下面代码1.得到前后移动的方向向量2.得到左右移动的方向向量3. 实现前后移动事件4. 实现左右移动事件5. 实现鼠标左键改变视角和移动方向

Java写一个快速排序_java实现快速排序

以上为思路。总的来说&#xff0c;快速排序也是利用了分治法的思想。基本步骤&#xff1a;1.先选择好合适的主元pivot&#xff0c;2.然后再把比主元小的元素放到主元的左边(右边)&#xff0c;把较大的元素放到主元的右边(左边)&#xff0c;3.接着再以主元为分界点&#xff0c;把…

解密ControlRotation与ActorRotation

在实现角色移动时&#xff0c;我们是通过获取当前角色向前或者向后移动的向量来计算具体的移动步长&#xff0c;进而增量设置角色位置以达到使角色移动的目的。但是获取向前或者向后的向量得先知道当前角色在世界坐标系中旋转的角度&#xff0c;于是我们就在ControlRotation和A…

系统会自带java吗_使用eclipse自带制作帮助系统

①help的api的生成1&#xff1a;项目中的生成javadoc或右击项目的导出&#xff0c;成javadoc格式。2&#xff1a;找打jdk中的Javadoc位置。如果忘记可以同cmd窗口通过指令寻找jdk位置&#xff0c;还可以直接再我的电脑中搜索javadoc。查找Javadoc.exe路径位置&#xff0c;填入j…

UE4 左右立体参数

在编辑器的editor preferences里设置下面参数

java work set没有显示出来_eclipse里新建work set,将项目分组放在不同文件夹

想必大家的Eclipse里也会有这么多得工程......每次工作使用到的项目肯定不会太多......每次从这么大数量的工程当中找到自己要使用的,必须大规模的滚动滚动条......有点不和谐了.无意当中看到了working set自己创建了一个 workingset 并将相应的 projects 添加到 working set 当…

指针的一些问题

1、c/c语言中不少地方&#xff0c;数组和指针可以相互替换使用&#xff0c;容易让人产生一种错觉&#xff0c;指针和数组是等价的。 数组要么在静态存储区域创建&#xff0c;如全局数组&#xff1b;要么在栈上创建如函数内的数组。数组的名称对应着&#xff08;而不是指向&…

tankwar的java坦克子弹撞墙_tankwar

tankwar 是使用java开发的一个单机版的小游戏 (未使用任何游戏引擎).和90经典版的坦克大战有些不同, 这里是纯坦克之间的战争, 英雄坦克并不用保护它的家.特色:1. 游戏共设6个关卡. (支持无限关卡)关卡设置中包括敌人坦克数量, 移动速度, 子弹速度, 以及子弹的杀伤力, 炸弹数量…

【翻译】使用Ext JS设计响应式应用程序

原文&#xff1a;Designing Responsive Applications with Ext JS在当今这个时代&#xff0c;用户都希望Web应用程序无论在形状还是大小上&#xff0c;既能在桌面电脑&#xff0c;也能在移动设备上使用。使应用程序能适应不同的需求渐成趋势。幸运的是&#xff0c;Ext JS 5提供…

java各种的不好_译文《最常见的10种Java异常问题》

封面&#xff1a;洛小汐译者&#xff1a;潘潘知彼知己&#xff0c;方能百战不殆。前言本文总结了有关Java异常的十大常见问题。目录检查型异常(checked) vs. 非检查型异常(Unchecked)异常管理的最佳实践箴言为什么在try代码块中声明的变量不能在catch或者finally中被引用&#…

Hadoop 开源调度系统zeus(二)

紧跟之前Hadoop 开源调度系统zeus(一) 本节主要介绍一下zeus的架构&#xff1a; 先给一个zeus的架构图 无论Master还是Worker都有一套WEB UI&#xff0c;无论从哪个上面去看&#xff0c;看到的结果都是一样的&#xff0c;实际上一般仅仅看主 Master&#xff1a;调度内核&#x…