您的位置:首页 > 其它

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Restful PUT