Tomcat + Spring MVC + HttpClient:怎样使用PUT和PATCH方法传递数据
在RESTful风格的API中。PUT/PATCH方法一般用于更新数据。在项目的代码中,使用的是HttpClient 4.5,是这样写的:
protected JSONObject doHttpUriRequest(HttpUriRequest httpUriRequest) {JSONObject result = null;HttpClient httpClient = HttpClients.createDefault();try {HttpResponse httpResponse = httpClient.execute(httpUriRequest);StatusLine responseStatusLine = httpResponse.getStatusLine();int statusCode = responseStatusLine.getStatusCode();if (statusCode == 200) {HttpEntity responseEntity = httpResponse.getEntity();String jsonString = EntityUtils.toString(responseEntity, CHARACTER_SET);result = new JSONObject(jsonString);EntityUtils.consume(responseEntity);} else {// error handling}} catch (IOException e) {e.printStackTrace();return onLocalError(e);}return result;
}protected JSONObject doHttpPatch(String uri, Map<String, String> params) {JSONObject result = null;HttpPatch httpPatch = new HttpPatch(uri);List<NameValuePair> nvps = constructNvps(params); // constructing name-value pairtry {httpPatch.setEntity(new UrlEncodedFormEntity(nvps, CHARACTER_SET));result = doHttpUriRequest(httpPatch);} catch (UnsupportedEncodingException e) {e.printStackTrace();return onLocalError(e);}return result;
}
当中doHttpUriRequest()是一个处理发送请求的工具函数。doHttpPatch()是详细处理数据的函数。
可见写法和一个普通的POST请求差点儿相同,仅仅是将HttpPost换成HttpPatch。
但是在server端,比方在params中有一个參数叫key。值是value,在Controller里面,能识别到这是一个PATCH方法,但是key的值是null。就是Servlet不能从form里面获取參数。
Google查了一下原因,大体是说PATCH这种方法非常新,就算到Tomcat 7.0.39也都不支持。
那怎么破呢?有两个办法:
1. 用URI来请求
既然不能使用form来获取參数,那就写在URI的尾巴吧:
protected JSONObject doHttpPatchWithURI(String uri, Map<String, String> params) {JSONObject result = null;URIBuilder uriBuilder = new URIBuilder();uriBuilder.setPath(uri);uriBuilder.setParameters(constructNvps(params));try {URI builtUri = uriBuilder.build();HttpPatch httpPatch = new HttpPatch(builtUri);result = doHttpUriRequest(httpPatch);} catch (URISyntaxException e) {e.printStackTrace();return onLocalError(e);}return result;
}
使用了这样的做法,servlet能够获得參数了。
这种方法有一个问题。就是即使key是null值,在URI的參数也会带上。在Servlet里面接收,key的值会变成”“(空字符串)。这样在RESTful风格API里面会有歧义:到底是不更新,还是更新成空字符串呢?
2. 在web.xml中增加一个filter
还有一种做法是保持使用上面POST风格的方法,在web.xml中增加一个filter:
<filter><filter-name>HttpPutFormContentFilter</filter-name><filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping><filter-name>HttpPutFormContentFilter</filter-name><servlet-name>springWebMvcDispatcher</servlet-name>
</filter-mapping>
当中springWebMvcDispatcher是servlet的名字。
Filter的工作是从request body的form data里面读取数据,然后包装成一个ServletRequest,使得ServletRequest.getParameter*()之类的方法能够读取到数据。
參考文档:
http://stackoverflow.com/questions/20370927/patch-method-in-tomcat-with-spring-mvc
Tomcat + Spring MVC + HttpClient:怎样使用PUT和PATCH方法传递数据相关推荐
- tomcat + spring mvc原理(二):tomcat容器初始化加载和启动
tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...
- tomcat + spring mvc 原理(一):tomcat原理综述和静态架构
tomcat + spring mvc 原理(一):tomcat原理综述和静态架构 tomcat + spring mvc的运作模式 tomcat内部的基本容器构成 tomcat容器对应的外部配置 t ...
- tomcat + spring mvc原理(六):tomcat WAR包的部署与加载
tomcat + spring mvc原理(六):tomcat WAR包的部署与加载 前言 监控的启动原理 状态监听 部署项目 前言 单独部署的tomcat服务器在运行中,当开发人员或者运维人员将开发 ...
- [技术分享]-Servlet/tomcat/spring mvc之间关系
首先,什么是Servlet?狭义的说,Servlet是JAVA提供的Servlet接口,我们可以看一眼Servlet接口的定义: [java] view plain copy A servlet is ...
- 【每日一篇】Servlet/tomcat/spring mvc之间关系
首先,什么是Servlet?狭义的说,Servlet是JAVA提供的Servlet接口,我们可以看一眼Servlet接口的定义: A servlet is a small Java program t ...
- spring mvc 中文乱码 post与get的方法解决
spring mvc表单提交中文参数乱码问题 今天测试spring mvc ,中文乱码,在web.xml中加上 <filter><filter-name>encodingFi ...
- spring MVC配置form支持PUT和DELETE方法
REST的关键原则之一就是"使用标准接口"(the use of the Uniform Interface),也就是提倡根据不同的语义使用GET, PUT, POST和DELET ...
- 0069 如何在Intellij IDEA中查看Spring MVC项目的所有请求与处理方法的映射列表
@RequestMapping注解分散于Controller中,如何在一个列表中看到所有的请求呢,比如下面这样: File-->Project Structure-->Modules--& ...
- ajax modelmap,spring mvc+ajax处理JSON返回前台的方法
在 Spring mvc3中,响应.接受 JSON都十分方便. 使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON. 使用 @RequestBod ...
- spring + spring mvc + tomcat 面试题(史上最全)下篇
场景1:单例的setter注入 这种注入方式应该是spring用的最多的,代码如下: @Service publicclass TestService1 {@Autowiredprivate Test ...
最新文章
- BERT-Pytorch demo初探
- mvc在页面上显示PDF
- MySQL InnoDB表压缩
- 注意力是非常宝贵的资源
- RDLC使用手册_RDLC报表部署
- 菜鸟学 VB 用API在PictureBox中I划线|平移|放大|缩小 详解and分享
- PS完美抠取头发丝----更换证件照背景完美去白边/蓝边/红边-----超实用方法
- 做一个电商网站需要多少钱
- 面试了15位来自985/211高校的2020届研究生之后的思考
- 鸿蒙系统首批机型,鸿蒙系统名单确认,麒麟9000机型首批,众多机型要说再见!...
- 计算机组成原理-I/O系统
- VSCode的LeetCode插件中国区账号密码登录错误
- MongoDB笔记 -- ReplicationSet复制集
- c语言程序设计教程+西安交通大学,大学C程序设计教程-西安交通大学.ppt
- 2019年二季度书单
- 手把手教你PyTorch项目:YOLO v3目标检测
- 计算机电缆zrdjypvp,阻燃计算机用电缆ZRDJYPVP
- Matlabe绘图plot求单调区间极大极小最值问题
- [转帖] cnblog新闻区 “40岁以上的员工,请自觉离开”
- 【故障诊断】基于粒子群和多元宇宙算法优化最大相关峭度解卷积(MCKD)实现信号处理附matlab代码
热门文章
- springcloud 微服务鉴权_推荐 1w+ 星标的 SpringCloud 微服务项目,开发脚手架
- Go基础-Mac中Go环境的安装以及实现第一个go程序hello world
- Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫,重磅新企划蓄势待发!
- 的不定积分_不定积分大集合——方法篇
- 小米8 android9手势,当小米8SE遇到安卓9.0,体验提升一个等级!
- eja智能压力变送器工作原理_eja变送器详解_eja变送器工作原理_eja变送器如何选型...
- pb中的tounicode 函数_历年高考数学的必考热点三角函数,2020高考生,你会了吗?...
- pythonATM,购物车项目实战2,主函数入口
- android 7.0添加菜单,Android 7.0 settings中添加/删除菜单
- 流程图函数’怎么画_程序员必备画图技能之——流程图