Restful PUT 方法,server端接受不到参数
2017-12-21 17:07
127 查看
不使用Restful框架,Spring MVC等方式开发一个Restful API.
client code:
private static void doPut(String url) throws IOException {
HttpPut httpPut = new HttpPut(url);
List<NameValuePair> parameters = new ArrayList<>();
parameters.add(new BasicNameValuePair("code", "c1"));
parameters.add(new BasicNameValuePair("id", "1"));
httpPut.setEntity(new UrlEncodedFormEntity(parameters, StandardCharsets.UTF_8));
HttpResponse httpResponse = HttpClients.createDefault().execute(httpPut);
int status = httpResponse.getStatusLine().getStatusCode();
}
-----------------------------------
server
1.用request.getParameters("xx") 接收不到参数
2.request.getInputStream() 可以拿到字符串 : code=c1&id=1 这样的格式需要手动解析
解决方式
1.加一个spring的filter,把参数解析为Map<String,String>,再使用request.getParameter()获取参数.
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/rest_api/*</url-pattern>
</filter-mapping>
源码如下:
protected void doFilterInternal(final HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (("PUT".equals(request.getMethod()) || "PATCH".equals(request.getMethod())) && this.isFormContentType(request)) {
HttpInputMessage inputMessage = new ServletServerHttpRequest(request) {
public InputStream getBody() throws IOException {
return request.getInputStream();
}
};
MultiValueMap<String, String> formParameters =
this.formConverter.read((Class)null, inputMessage);
HttpServletRequest wrapper = new HttpPutFormContentFilter.HttpPutFormContentRequestWrapper(request, formParameters);
filterChain.doFilter(wrapper, response);
} else {
filterChain.doFilter(request, response);
}
}
public MultiValueMap<String, String> read(Class<? extends MultiValueMap<String, ?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
MediaType contentType = inputMessage.getHeaders().getContentType();
Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : this.charset;
String body = StreamUtils.copyToString(inputMessage.getBody(), charset);
String[] pairs = StringUtils.tokenizeToStringArray(body, "&");
MultiValueMap<String, String> result = new LinkedMultiValueMap(pairs.length);
String[] var8 = pairs;
int var9 = pairs.length;
for(int var10 = 0; var10 < var9; ++var10) {
String pair = var8[var10];
int idx = pair.indexOf(61);
if (idx == -1) {
result.add(URLDecoder.decode(pair, charset.name()), (Object)null);
} else {
String name = URLDecoder.decode(pair.substring(0, idx), charset.name());
String value = URLDecoder.decode(pair.substring(idx + 1), charset.name());
result.add(name, value);
}
}
return result;
}
2.client端使用Json封装参数再传递到server端,server端request.getInputStream()后解析Json.
client code:
private static void doPut(String url) throws IOException {
HttpPut httpPut = new HttpPut(url);
List<NameValuePair> parameters = new ArrayList<>();
parameters.add(new BasicNameValuePair("code", "c1"));
parameters.add(new BasicNameValuePair("id", "1"));
httpPut.setEntity(new UrlEncodedFormEntity(parameters, StandardCharsets.UTF_8));
HttpResponse httpResponse = HttpClients.createDefault().execute(httpPut);
int status = httpResponse.getStatusLine().getStatusCode();
}
-----------------------------------
server
1.用request.getParameters("xx") 接收不到参数
2.request.getInputStream() 可以拿到字符串 : code=c1&id=1 这样的格式需要手动解析
解决方式
1.加一个spring的filter,把参数解析为Map<String,String>,再使用request.getParameter()获取参数.
<filter>
<filter-name>HttpPutFormContentFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpPutFormContentFilter</filter-name>
<url-pattern>/rest_api/*</url-pattern>
</filter-mapping>
源码如下:
protected void doFilterInternal(final HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
if (("PUT".equals(request.getMethod()) || "PATCH".equals(request.getMethod())) && this.isFormContentType(request)) {
HttpInputMessage inputMessage = new ServletServerHttpRequest(request) {
public InputStream getBody() throws IOException {
return request.getInputStream();
}
};
MultiValueMap<String, String> formParameters =
this.formConverter.read((Class)null, inputMessage);
HttpServletRequest wrapper = new HttpPutFormContentFilter.HttpPutFormContentRequestWrapper(request, formParameters);
filterChain.doFilter(wrapper, response);
} else {
filterChain.doFilter(request, response);
}
}
public MultiValueMap<String, String> read(Class<? extends MultiValueMap<String, ?>> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
MediaType contentType = inputMessage.getHeaders().getContentType();
Charset charset = contentType.getCharSet() != null ? contentType.getCharSet() : this.charset;
String body = StreamUtils.copyToString(inputMessage.getBody(), charset);
String[] pairs = StringUtils.tokenizeToStringArray(body, "&");
MultiValueMap<String, String> result = new LinkedMultiValueMap(pairs.length);
String[] var8 = pairs;
int var9 = pairs.length;
for(int var10 = 0; var10 < var9; ++var10) {
String pair = var8[var10];
int idx = pair.indexOf(61);
if (idx == -1) {
result.add(URLDecoder.decode(pair, charset.name()), (Object)null);
} else {
String name = URLDecoder.decode(pair.substring(0, idx), charset.name());
String value = URLDecoder.decode(pair.substring(idx + 1), charset.name());
result.add(name, value);
}
}
return result;
}
2.client端使用Json封装参数再传递到server端,server端request.getInputStream()后解析Json.
相关文章推荐
- 解决ajax的delete、put方法接受不到参数的问题
- 资料汇总--Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格)【转】
- struts中在Action里写了setter方法接受不到参数
- springmvc restful put delete Ajax 请求参数取不到-已解决
- Spring的RequestMethod.PUT方法接收不到参数
- 使用Struts2的模型驱动(ModelDriven)来接受参数发现取不到值---解决方法
- 解决ajax的delete、put方法接收不到参数的问题方法
- Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格
- Ajax中Put和Delete请求传递参数无效的解决方法(Restful风格)
- 解决spring mvc获取不到PUT方法参数问题
- SpringMVC大坑之PUT方法接收不到请求参数
- 关于SpringMVC或Struts2接受参数接收不到的原因
- struts2-动态调用方法&接受请求参数
- 针对RestFul风格的PUT,DELETE请求在SpringMVC的Controller层无法接收参数的解决方案
- 可以把List<String>传递给一个接受List<Object>参数的方法吗?
- 说说RESTFUL中的方法:GET、POST、PUT、PATCH、DELETE、OPTIONS、HEAD、TRACE
- jsp URI传递参数,对方接受是乱码解决方法
- Springmvc接受不同对象的同名参数解决方法:
- 几种JavaScript接受URL参数的方法
- Servlet通过get方式接受参数乱码解决方法