Restful PUT 方法,server端接受不到参数

在不使用Restful框架如Spring MVC的情况下,PUT请求的参数在服务器端通过request.getParameters()无法获取。可以使用HttpPutFormContentFilter解析请求体或将参数封装为Json传递。server端需添加filter来处理PUT请求的表单内容,client端可以改为发送Json格式的数据。
不使用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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值