比如一個接口,既想實現請求參數是application/json,又想實現form提交,改怎么做呢?用postman去測試,發現不可能做到兩全其美。
我有一個方法,就是不用requestbody,也可以實現json解析,首先是新建一個包裝類,這個類可以重復讀inputstream里面的東西。
如果加了requestbody,就無法用form提交,如果去掉requestbody 那么就無法獲取到json里面的值,因為全是null.
class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body;
public BodyReaderHttpServletRequestWrapper(HttpServletRequest request)
throws IOException {
super(request);
//編碼默認iso-8859-1
body = StreamUtil.readBytes(request.getReader(), "utf-8");
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bais.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener listener) {
}
};
}
}
然后再從inputstream里面拿東西就OK拉
public static JSONObject receivePost(HttpServletRequest request) throws IOException, UnsupportedEncodingException {
// 讀取請求內容
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
sb.append(line);
}
//將json字符串轉換為json對象
JSONObject json=JSONObject.parseObject(sb.toString());
return json;
}
最后在action里面做判斷就OK了,大功告成。
if(servletRequest.getContentType().equals("application/json"))
{
servletRequest= new BodyReaderHttpServletRequestWrapper( servletRequest);
JSONObject d= receivePost(servletRequest);
}
else
{
Map<String,String[]> map= servletRequest.getParameterMap();
}
