在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方法传递数据相关推荐

  1. tomcat + spring mvc原理(二):tomcat容器初始化加载和启动

    tomcat + spring mvc原理(二):tomcat容器动态加载 容器通用生命周期标准 容器通用生命周期的实现 生命周期状态监听器的管理实现 生命周期方法实现 宏观来看各种容器生命周期的实际 ...

  2. tomcat + spring mvc 原理(一):tomcat原理综述和静态架构

    tomcat + spring mvc 原理(一):tomcat原理综述和静态架构 tomcat + spring mvc的运作模式 tomcat内部的基本容器构成 tomcat容器对应的外部配置 t ...

  3. tomcat + spring mvc原理(六):tomcat WAR包的部署与加载

    tomcat + spring mvc原理(六):tomcat WAR包的部署与加载 前言 监控的启动原理 状态监听 部署项目 前言 单独部署的tomcat服务器在运行中,当开发人员或者运维人员将开发 ...

  4. [技术分享]-Servlet/tomcat/spring mvc之间关系

    首先,什么是Servlet?狭义的说,Servlet是JAVA提供的Servlet接口,我们可以看一眼Servlet接口的定义: [java] view plain copy A servlet is ...

  5. 【每日一篇】Servlet/tomcat/spring mvc之间关系

    首先,什么是Servlet?狭义的说,Servlet是JAVA提供的Servlet接口,我们可以看一眼Servlet接口的定义: A servlet is a small Java program t ...

  6. spring mvc 中文乱码 post与get的方法解决

    spring mvc表单提交中文参数乱码问题 今天测试spring mvc  ,中文乱码,在web.xml中加上 <filter><filter-name>encodingFi ...

  7. spring MVC配置form支持PUT和DELETE方法

    REST的关键原则之一就是"使用标准接口"(the use of the Uniform Interface),也就是提倡根据不同的语义使用GET, PUT, POST和DELET ...

  8. 0069 如何在Intellij IDEA中查看Spring MVC项目的所有请求与处理方法的映射列表

    @RequestMapping注解分散于Controller中,如何在一个列表中看到所有的请求呢,比如下面这样: File-->Project Structure-->Modules--& ...

  9. ajax modelmap,spring mvc+ajax处理JSON返回前台的方法

    在 Spring mvc3中,响应.接受 JSON都十分方便. 使用注解@ResponseBody可以将结果(一个包含字符串和JavaBean的Map),转换成JSON. 使用 @RequestBod ...

  10. spring + spring mvc + tomcat 面试题(史上最全)下篇

    场景1:单例的setter注入 这种注入方式应该是spring用的最多的,代码如下: @Service publicclass TestService1 {@Autowiredprivate Test ...

最新文章

  1. BERT-Pytorch demo初探
  2. mvc在页面上显示PDF
  3. MySQL InnoDB表压缩
  4. 注意力是非常宝贵的资源
  5. RDLC使用手册_RDLC报表部署
  6. 菜鸟学 VB 用API在PictureBox中I划线|平移|放大|缩小 详解and分享
  7. PS完美抠取头发丝----更换证件照背景完美去白边/蓝边/红边-----超实用方法
  8. 做一个电商网站需要多少钱
  9. 面试了15位来自985/211高校的2020届研究生之后的思考
  10. 鸿蒙系统首批机型,鸿蒙系统名单确认,麒麟9000机型首批,众多机型要说再见!...
  11. 计算机组成原理-I/O系统
  12. VSCode的LeetCode插件中国区账号密码登录错误
  13. MongoDB笔记 -- ReplicationSet复制集
  14. c语言程序设计教程+西安交通大学,大学C程序设计教程-西安交通大学.ppt
  15. 2019年二季度书单
  16. 手把手教你PyTorch项目:YOLO v3目标检测
  17. 计算机电缆zrdjypvp,阻燃计算机用电缆ZRDJYPVP
  18. Matlabe绘图plot求单调区间极大极小最值问题
  19. [转帖] cnblog新闻区 “40岁以上的员工,请自觉离开”
  20. 【故障诊断】基于粒子群和多元宇宙算法优化最大相关峭度解卷积(MCKD)实现信号处理附matlab代码

热门文章

  1. springcloud 微服务鉴权_推荐 1w+ 星标的 SpringCloud 微服务项目,开发脚手架
  2. Go基础-Mac中Go环境的安装以及实现第一个go程序hello world
  3. Kafka 麒麟先生_近百位超人气嘉宾出席元旦萤火虫,重磅新企划蓄势待发!
  4. 的不定积分_不定积分大集合——方法篇
  5. 小米8 android9手势,当小米8SE遇到安卓9.0,体验提升一个等级!
  6. eja智能压力变送器工作原理_eja变送器详解_eja变送器工作原理_eja变送器如何选型...
  7. pb中的tounicode 函数_历年高考数学的必考热点三角函数,2020高考生,你会了吗?...
  8. pythonATM,购物车项目实战2,主函数入口
  9. android 7.0添加菜单,Android 7.0 settings中添加/删除菜单
  10. 流程图函数’怎么画_程序员必备画图技能之——流程图