这里面我们主要介绍一下spring中关于请求和响应参数数据的问题。爱,从来就是一件千回百转的事。不曾被离弃,不曾受伤害,怎懂得爱人?爱,原来是一种经历。

spring中的请求与响应

一、spring中json格式的post请求

客户端发送json格式的数据,例如以下的user对象的信息是我们要插入到数据库中的。

  1. {
  2. "userId": "huhx1",
  3. "username": "linux1",
  4. "passowrd": "pwd11",
  5. "sex": "",
  6. "phoneNumber": "",
  7. "address": "wuhan1",
  8. "birthday": "2017-12-12"
  9. }

我们的controller处理方法中的参数可以用Bean接收,也可以使用Map。如下:

  1. @PostMapping("user3")
  2. public ResponseBean<User> insertUser(@RequestBody User user) {
  3. logger.info("user = {}", user);
  4. userMapper.insertUser(user);
  5. return ResultUtil.success(user);
  6. }
  7.  
  8. @PostMapping("user4")
  9. public ResponseBean<Map<String, Object>> insertUser(@RequestBody Map<String, Object> user) {
  10. logger.info("map = {}", user);
  11. userMapper.insertMapUser(user);
  12. return ResultUtil.success(user);
  13. }

  需要注意的是参数必须要用@RequestBody注解,否则请求的参数是不能正确的注入到参数的类中。关于这个注解和@ResponseBody差不多的功能,就是可以将我们的请求或者响应的数据通过HttpMessageConverters类转换成我们想要的类型(被注解的类型)。官方文档说明如下:

  1. @RequestBody annotated parameters for access to the HTTP request body. Parameter values are converted to the declared method argument type using HttpMessageConverters.
  2.  
  3. If the method is annotated with @ResponseBody, the return type is written to the response HTTP body. The return value will be converted to the declared method argument type using HttpMessageConverters.
  4.  
  5. @RestController is a stereotype annotation that combines @ResponseBody and @Controller.

对于json格式的传递参数,使用@RequestParam也无法正确传递参数。例如像下面的这种:

请求的json数据如下:

  1. {
  2. "type": "file",
  3. "content": "huhx.txt"
  4. }

下面是我们的java代码

  1. @PostMapping("javasql")
  2. public String generateJavaBean2(@RequestParam String type, @RequestParam String content) {}

而且对于这种有两个参数的话,使用@RequestBoby注解两个参数的话,也会报错的。

  1. Required request body is missing: public java.lang.String com.linux.huhx.generate.db.MysqlBeanAction.generateJavaBean2(java.lang.String,java.lang.String) throws java.io.IOException

正确的做法应该如下:

  1. public String generateJavaBean2(@RequestBody Map<String, String> map) throws IOException {
  2. String type = map.get("type");
  3. String content = map.get("content");
  4. }

二、spring中表单格式的post请求

  如果是表单形式的post请求,那么不需要@RequestBody注解。直接在controller对应方法的参数中注明该类就可以,在postman中如果birthday输入的是2017-12-12。会报string不能转换成date的错,这里面如果一定要支持2018-12-12字符串格式的时间传递,可以使用spring自定义的converter或者formatter接口的实现类。具体可以参考博客:

上述测试的java代码

  1. @PostMapping("user3")
  2. public ResponseBean<User> insertUser(User user) {
  3. logger.info("user = {}", user);
  4. userMapper.insertUser(user);
  5. return ResultUtil.success(user);
  6. }

在使用JSON.toJSONString(this);格式化对象控制台中输出的结果如下:

  1. user = {"birthday":,"password":"","phoneNumber":"","sex":,"userId":"huhx3","username":"huhx3"}

  我们返回的数据都是json格式的,这是因为我们在注解控制器的时候用的是@RestController注解。上述也提到过了,它是@Controller和@ResponseBody的复合注解。可以在它的源码中找到:

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Controller
  5. @ResponseBody
  6. public @interface RestController {
  7. String value() default "";
  8. }

三、spring中表单的get请求

  • get传递参数的方式,我们的java代码如下:
  1. @GetMapping("getRequest1")
  2. public ResponseBean<String> getRequest1(String username) {
  3. logger.info("username = {}", username);
  4. return ResultUtil.success(username);
  5. }

我们通过postman发送get请求,url为:localhost:9998/mapper/getRequest1?username=huhx。返回的结果如下:

  1. {
  2. "returnCode": ,
  3. "returnMessage": "成功",
  4. "response": "huhx"
  5. }

可以看到成功的接收到了get的请求参数,当然也可以使用@RequestParam修改参数的名称。如下:

  1. @GetMapping("getRequest1")
  2. public ResponseBean<String> getRequest1(@RequestParam("username") String name) {
  3. logger.info("username = {}", name);
  4. return ResultUtil.success(name);
  5. }
  • get请求路径上的参数
  1. @GetMapping("getRequest2/{username}")
  2. public ResponseBean<String> getRequest2(@PathVariable("username") String name) {
  3. logger.info("username = {}", name);
  4. return ResultUtil.success(name);
  5. }

如果像上述url参数的那样,省略@PathVariable注解,使用下面的这种方式将会失效得不到传递的参数。

  1. @GetMapping("getRequest2/{username}")
  2. public ResponseBean<String> getRequest2(String username) {
  3. logger.info("username = {}", username);
  4. return ResultUtil.success(username);
  5. }

友情链接

spring基础---->请求与响应的参数(一)的更多相关文章

  1. struts2基础——请求与响应、获取web资源

    一.请求与响应 Action1.含义:(1) struts.xml 中的 action 元素,也指 from 表单的 action 属性,总之代表一个 struts2 请求.(2) 用于处理 Stru ...

  2. SpringMVC04 很杂很重要(注解,乱码处理,通配符,域属性调用,校正参数名称,访问路径,请求、响应携带参数,请求方法)

    1.导入架包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3 ...

  3. Spring 处理请求和响应相关的注解

    @Controller 默认返回 templates 目录下的 string.html 页面内容. 在方法中加上 @ResponseBody 注解,可以返回JSON.XML或自定义mediaType的 ...

  4. HeadFirst Jsp 04 (请求和响应作为servlet)

    servlet 的存在就是为了客服服务, servlet的任务是得到一个客户的请求, 再发回一个响应. 由上图可知, web 容器会在启动后就加载所有的servlet类, 并为之创建实例和初始化 注意 ...

  5. Spring Boot 2.x基础教程:如何扩展XML格式的请求和响应

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  6. Spring Boot中如何扩展XML请求和响应的支持

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  7. Spring Boot中扩展XML请求和响应的支持

    在Spring Boot中,我们大多时候都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式返回一 ...

  8. 2.(基础)tornado的请求与响应

    之前我们介绍了tornado 的基础流程,但是还遗留了一些问题,今天我们就来解决这些遗留问题并学习新的内容 settings,使用tornado.web.Application(handler, ** ...

  9. Spring Cloud Gateway修改请求和响应body的内容

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. maven中json-lib库无法引入

    今天在maven中引入json-lib库,intellij中的pom文件没有报错,但是在类中就是无法使用. pom依赖配置: <dependency> <groupId>net ...

  2. (转)最简单的基于FFmpeg的内存读写的例子:内存播放器

    ffmpeg内存播放解码 目录(?)[+] ===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章 ...

  3. CentOS下 RabbitMQ单机安装配置

    CentOS RabbitMQ rpm 安装方法: 系统环境:CentOS6IP地址:10.100.62.41 1.erlang安装: erlang下载地址: http://www.rabbitmq. ...

  4. php 多页面间共享变量

    1. 保存session的页面session1.php <? echo "hi, let's try session<br/>"; session_start() ...

  5. PHP获取MySql新增记录ID值的3种方法

    From: http://www.jb51.net/article/51473.htm 这篇文章主要介绍了PHP获取MySql新增记录ID值的3种方法,一般使用PHP自带函数mysql_insert_ ...

  6. [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)

    -- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...

  7. Backlight当前行背景高亮显示

    下载地址:https://github.com/limejelly/Backlight-for-XCode PS:Xcode 8.0 默认支持了 跟VVDocumenter规范注释生成器的安装方式一样 ...

  8. 周期性调度器scheduler_tick

    周期性调度器由中断实现,系统定时产生一个中断,然后启动周期性调度器,周期性调度器执行过程中要关闭中断, 周期性调度器执行完毕后再打开中断(handle_IRQ_event,  IRQF_DISABLE ...

  9. web_submit_data详解

    定义:处理无状态或者上下文无关的表单提交.它用来生成表单的GET或POST请求,这些请求与Form自动生成的请求是一样的,发送这些请求时不需要表单上下文. 函数形式:web_submit_data( ...

  10. MongoDB:通过mongodump【时间一致性】备份,快速创建secondary复制集节点——更精简的方式2

    该方式优点:快速通过mongodump初始化数据库,大大减少新的secondary节点从头开始初始化的风险:网络壅塞.oplog.rs过期.耗时太长等. 还原的关键:一致性mongodump备份 +  ...