最近在做一個HTTP接口的數據傳輸項目,其中要通過Json格式發送數據報文。在調試過程中遇到了一個問題,即Json報文發送完全但接收不全。
我們先來看看發送端的代碼:
//構建Json對象 JSONObject jsonObj = new JSONObject(); jsonObj.put("name", "張三"); jsonObj.put("age", 20); jsonObj.put("gender", "男"); //發送Json報文 String jsonStr = jsonObj.toJSONString(); StringEntity entity = new StringEntity(jsonStr, ContentType.APPLICATION_JSON); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost);
從代碼中可以看出,我們使用了Json庫來構建了一個Json對象,然后轉換為字符串后發送到了服務器端。但問題出在了服務器端接收Json報文時。
我們看看接收端的代碼:
//讀取Json報文 BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream())); StringBuffer sb = new StringBuffer(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); } //Json解析 JSONObject jsonObj = JSON.parseObject(sb.toString()); String name = jsonObj.getString("name"); int age = jsonObj.getIntValue("age"); String gender = jsonObj.getString("gender");
從接收端的代碼中可以看到,我們使用了BufferedReader來讀取接收到的數據報文,然后再轉換為Json對象進行解析。但問題在于,readLine()方法只會讀取到換行符之前的內容。而HttpEntity的默認編碼方式是Content-Type: text/plain,所以Json報文中的雙引號、大括號等字符并不含有換行符,導致無法完整讀取到Json報文。
為了解決這個問題,我通過設置HttpEntity的編碼方式來解決。修改發送端代碼如下:
String jsonStr = jsonObj.toJSONString(); StringEntity entity = new StringEntity(jsonStr, ContentType.APPLICATION_JSON.withCharset("UTF-8")); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost);
這樣,我們就設置了編碼方式為UTF-8,保證了在Json報文中出現的字符都會被正確地讀取。然后再修改接收端代碼如下:
BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8")); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); } JSONObject jsonObj = JSON.parseObject(sb.toString()); String name = jsonObj.getString("name"); int age = jsonObj.getIntValue("age"); String gender = jsonObj.getString("gender");
這樣,我們就成功解決了Json報文發送完全但接收不全的問題。
下一篇vue自組建