Spring RestController 请求参数详解

引用作者jpfss

在阅读之前,最好先了解http请求的get,post,以及各种head头类型,请求参数类型。

无参数,设置RestController请求路径

查询字符串参数,可选和必选参数

json参数,RestController用实体类型接受

路径参数

body参数

文件流参数

1 无参数,设置RestController请求路径

下面是一个例子,例子无请求参数,通过@RequestMapping设置了请求的路由路径和请求方法。路由路由由类的mapping和方法的mapping组成,在后面的例子中,我就不再写出RestApiRequestDemoController类的mapping了。记住,url里面有个demo在前面。

@RestController
@RequestMapping("/demo")
public class RestApiRequestDemoController { ///方法说明: 普通查询
///示例请求:http://localhost:8091/demo/list
@RequestMapping(value="/searchList",method = RequestMethod.POST)
@ResponseBody
public List<UserModel> searchList() {
List list = new list();
return list;
}
}

2 查询字符串参数,可选和必选参数2. 查询字符串参数,可选和必选参数

下面是使用查询字符串的例子,required可以设置请求的字符串是否必填

///方法说明:url参数的使用-查询字符串 ,且name必填
///示例请求:http://localhost:8091/demo/searchListByName?name=liuyanwei
@RequestMapping(value="/listByName",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@RequestParam(value="name",required = true) String name) { Session context = DatabaseHelper.context();
String sql = "select * from tb_user where name ='"+ name+"'" ;
List list = context.createSQLQuery(sql)
.setResultTransformer(Transformers.aliasToBean(TbUserModel.class))
.list();
return list; }

3 json参数,RestController用实体类型接受

注意,需要设置application/json 否则数据库会返回。hibernate操作数据库代码暂时可以不用去管他。

/*
* 方法说明:添加数据
* 1:使用json数据提交,直接使用实体对象接收
* 2:hibernate 添加数据
* 请求参数: {"id":1,"userId":1,"pwd":"123","name":"123","pwd":"123","headPortait":"123","isEnable":"123","createDate":"2015-05-12","lastLogin":"2015-05-12"}
* 请求头:Content-Type : application/json
* 请求ur:http://localhost:8091/demo/addUser
* */
@RequestMapping(value="/addUser",method = RequestMethod.POST)
@ResponseBody
public TbUserModel addUser(@RequestBody TbUserModel user) { Session context = DatabaseHelper.context();
Transaction tran = context.beginTransaction();
context.save(user);
tran.commit();
user.setId(user.getId());
context.close();
return user;
}

4 路径参数

路径参数不能设置是否必填,全部都是必须填,不能省略的

///方法说明:url参数的使用
///示例请求:http://localhost:8091/demo/searchListById/2
@RequestMapping(value="/searchListById/{id}",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@PathVariable("id") int id) { Session context = DatabaseHelper.context();
// String sql = "select * from tb_user where id ="+ id ;
String sql = "select * from tb_user where tb_user.id = :id";
System.out.println(sql);
List list = context.createSQLQuery(sql).setInteger("id", id)
.setResultTransformer(Transformers.aliasToBean(TbUserModel.class))
.list();
return list;
}

高级用法:路径参数可以自由设置自己的规则,比如,你有个请求需要两个参数,月和日,你可以写成{month}-{day}

///方法说明:url参数的使用
///示例请求:http://localhost:8091/demo/searchListByDate/2-10
@RequestMapping(value="/searchListByDate/{month}-{day}",method = RequestMethod.POST)
@ResponseBody
public List<TbUserModel> searchList(@PathVariable("month") int month,
@PathVariable("day") int day) { }

5. 表单参数参数

注意,

这种方式传参数不能设置参数选填

注意,参数写在boby中,相当于表单参数,必须设置请求头为:application/x-www-form-urlencoded

若参数不正确,是无法进入控制器的。

    /*
* 方法说明:使用表单方式提交数据
* 请求参数:isEnable=1&name=cool
* 配置
* 请求头:Content-Type : application/x-www-form-urlencoded
* 请求url:http://localhost:8091/demo/findUsersByName
* */
@RequestMapping(value="/findUsersByName",method = RequestMethod.POST)
@ResponseBody
public void findUsersByName(boolean isEnable , String name)
{
System.out.println(isEnable);
System.out.println(name);
}

6. 文件流参数

单个文件通过这种方式 @RequestParam(“file”) MultipartFile file获得,这里是简单的写法,相当于 MultipartFile file = ((MultipartHttpServletRequest) request).getFile(“file”); 多个文件使用@RequestParam(“files”) MultipartFile[] files)

表单中文件的name属性必须设置file(注意,不是文件名),例如,html中

这个是简单获取文件的方式,若不知道表单中文件的name属性,可以通过request获取文件

例子:

@RequestMapping("upload")
public Resp upload(HttpServletRequest request,
HttpServletResponse response, @RequestParam("file") MultipartFile file){ try {
//MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
String filePath = FilesService.uploadFile(file, request);
return Resp.succeedResp(filePath);
}
catch (Exception e){
e.printStackTrace();
} return Resp.failureResp("图片上传失败");
} @RequestMapping("batchUpload")
public Resp batchUpload(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("files") MultipartFile[] files) throws IOException {
List<String> list = new ArrayList<String>();
try {
for (MultipartFile file :files) {
String filePath = FilesService.uploadFile(file, request);
list.add(filePath);
System.out.println("filePath:" + filePath);
}
return Resp.succeedResp(list);
}
catch (Exception e){
e.printStackTrace();
}
return Resp.failureResp("文件上传失败");
}

总结

想要把Rest风格的api用好,合理利用参数是必须的。不同功能的api使用不同类型的参数接收方式。每个人有不同的习惯,我的习惯是:

一般获取内容,不涉及加密的用get方法,设计加密的用post

提交内容,例如添加,删除,修改,使用post、delete、put方法

通过主键获取内容的,我习惯用url参数,例如:/news/details/1,参数不是很多,组合起来有意义的也会用url路径组合,例如前面的日期:/demo/searchListByDate/2-10

有时候接收参数组合起来用比较好,有的内容通过url参数,有的部分用表单内容。

所有的设计接收参数的原则就是,然你的api的url能读通,看起来合理。

好了,就到这了,后面有时间我会再写一些hibernate 数据操作的例子和hibernate获取实体参数验证的内容,有的问题我也还没完全搞清楚,后面在研究看看。

Spring RestController 请求参数详解的更多相关文章

  1. spring @Transactional注解参数详解

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: @Transactional public class TestServiceBean imp ...

  2. spring @Transactional注解参数详解(转载)

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean i ...

  3. spring @Transactional注解参数详解(13)

    事物注解方式: @Transactional 当标于类前时, 标示类中所有方法都进行事物处理 , 例子: 1 @Transactional public class TestServiceBean i ...

  4. Spring Boot启动命令参数详解及源码分析

    使用过Spring Boot,我们都知道通过java -jar可以快速启动Spring Boot项目.同时,也可以通过在执行jar -jar时传递参数来进行配置.本文带大家系统的了解一下Spring ...

  5. spring注入参数详解

    spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...

  6. Spring Batch(4): Job详解

    Spring Batch(4): Job详解 2016-03-26 18:46 870人阅读 评论(1) 收藏 举报  分类: Spring(6)  版权声明:本文为博主原创文章,未经博主允许不得转载 ...

  7. Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程

    上文,我们看了IOC设计要点和设计结构:紧接着这篇,我们可以看下源码的实现了:Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的. ...

  8. Spring框架系列(8) - Spring IOC实现原理详解之Bean实例化(生命周期,循环依赖等)

    上文,我们看了IOC设计要点和设计结构:以及Spring如何实现将资源配置(以xml配置为例)通过加载,解析,生成BeanDefination并注册到IoC容器中的:容器中存放的是Bean的定义即Be ...

  9. Spring框架系列(11) - Spring AOP实现原理详解之Cglib代理实现

    我们在前文中已经介绍了SpringAOP的切面实现和创建动态代理的过程,那么动态代理是如何工作的呢?本文主要介绍Cglib动态代理的案例和SpringAOP实现的原理.@pdai Spring框架系列 ...

随机推荐

  1. NO Route to Host 连接mysql数据库

    显然是请求被服务器的防火墙给拦截了 1,vi /etc/sysconfig/iptables 2,在倒数第三行以前添加 -A INPUT -p tcp -m state --state NEW -m  ...

  2. log4j.properties配置详解与实例-全部测试通过[转]

    最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛没有一点格式,看着累.这里把网上收集到的整理了一下,并且全部都在机器上测试成功了.这么好的文档估计没有了吧? # ...

  3. Photoshop去图片水印——适用复杂图片上有水印

    该方法适合复杂图片上有水印的,不过这个只适合水印只是文字而没有背景的那种.不是所有的水印图片都适合处理.下面是处理前后的对照   工具/原料   photoshop8.0 方法/步骤   1 打开需要 ...

  4. IntelliJ IDEA 17 本地LicenseServer激活

    注意:此方法适用于Idea v2017.2.x 版本及以前版本. IntelliJ IDEA及破解包下载地址:百度网盘   密码:hlko 一.将IntelliJIDEALicenseServer.e ...

  5. nvm(Node Version Manager)管理node版本

    nvm全称Node Version Manager是 Nodejs 版本管理器,它让我们能方便的对 Nodejs 的版 本进行切换. nvm 的官方版本只支持 Linux 和 Mac. Windows ...

  6. easyui combobox 动态加载数据C#

    <script type="text/javascript" src="Scripts/jquery-1.8.2.min.js"></scri ...

  7. selenium键盘操作

    键盘操作需引用: from selenium.webdriver.common.keys import Keys 操作码表: NULL = '\ue000' CANCEL = '\ue001' # ^ ...

  8. vue2.0leaflet

    github源码在此,记得点星:https://github.com/brandonxiang/vueleaflet 参考文档:https://korigan.github.io/Vue2Leafle ...

  9. java的运行机制及初步相关配置(jdk)

    java的运行机制: 计算机高级语言的类型主要有编译型和解释型两种,而java语言是两种类型的结合. java首先利用文本编译器编写java源程序,源文件的后缀名为.java:再利用编译器(javac ...

  10. C++实现 safaBase64编码跟nonSafeBase64编码的转换

    默认Base64编码的字符串,用于网络传输是不安全的,因为Base64编码使用的标准字典含有“+”,“/”. 规则如下: //nonSafeBase64 到 safeBase64'+'  ------ ...