背景吐槽
這個問題是筆者在維護一個祖傳老項目的時候遇到的問題,項目中接收數據的類都是最原生的servlet類,裏面的方法都是doPost,doGet,總之是個頭大的祖傳老項目。。。。
問題
由於需要前端上傳一些比較大的json數據串,這種情況下如果用GET方法,然後再servlet中的doGet()方法中使用request.getParameter("字段名")的話是拿不到數據的,
再者如果json串比較複雜而且比較大,使用get方式會直接報錯400。所以只能使用POST請求方式了,那麼這種情況下如何從HttpServletRequest中拿到body中的json串呢?
下面看解決方法和代碼。
解決方法
這裏用到的是緩衝字符流(因爲我們的Json串都是文字字符之類的,所以使用字符流比使用字節流更好),示例代碼如下:
@WebServlet(name = "testServlet", urlPatterns = "/api/testServlet")
public class TestServlet extends HttpServlet {
private Gson gson = new Gson();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
//自定義從bodyt中獲取json格式數據
StringBuffer sb = new StringBuffer();
String line = null;
try {
BufferedReader reader = request.getReader();
while ((line = reader.readLine()) != null)
sb.append(line);
} catch (Exception e) { /*report an error*/ }
//將空格和換行符替換掉避免使用反序列化工具解析對象時失敗
String jsonString = sb.toString().replaceAll("\\s","").replaceAll("\n","");
//下面就可以使用如GSON或FastJson之類的工具解析成自己的對象數據並做後續的業務邏輯處理了
......
........
返回結果
PrintWriter out = response.getWriter();
out.write("success");
out.close();
}