Tomcat + Spring MVC + HttpClient:如何使用PUT和PATCH方法传递数据
来源:互联网 发布:禅道linux安装 编辑:程序博客网 时间:2024/05/18 18:47
在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 pair try { 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方法传递数据
- spring mvc 3支持 http 的put和delete方法
- spring mvc 3支持 http 的put和delete方法
- spring MVC配置form支持PUT和DELETE方法
- HTTP方法--Put 还是 Patch?
- spring mvc 重定向后还能传递对象数据的方法
- Spring MVC 传递模型数据到视图中方法总结
- mvc如何使用JavaScript在view和controller之间传递数据
- Spring mvc 浏览器支持 put, delete 提交方法
- Spring mvc 浏览器支持 put, delete 提交方法
- spring mvc RestFul风格PUT方法修改上传文件
- Spring MVC使用RESTful风格的PUT请求
- 使用httpClient向接口传递数据
- 区分PATCH与PUT、POST方法
- 区分PATCH与PUT、POST方法
- 区分PATCH与PUT、POST方法
- springMVC使用PUT、DELETE方法传递参数解决方案
- HTTP 浅谈 POST, PUT 和 PATCH
- 小地形
- git不得不用的理由
- createjs初学-简单的图片拖拽
- 7.22基础控件
- codevs1048
- Tomcat + Spring MVC + HttpClient:如何使用PUT和PATCH方法传递数据
- 小超的实习生涯之ImageLoader
- ORACLE 表函数
- Voice Over 使用总结
- hdu 5288 OO’s Sequence(2015 Multi-University Training Contest 1)
- Android在onCreate或者在Fragment的onCreateView中获取控件、屏幕的宽高
- SQLLDR示例
- CorpAct抽样模板
- UIApplication sharedApplication 的常用使用方法