如何從HttpServletRequest中拿到前端以application/json形式傳輸的body中的json串

背景吐槽

這個問題是筆者在維護一個祖傳老項目的時候遇到的問題,項目中接收數據的類都是最原生的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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章