色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

json報文發送完全但接收不全6

曾興旺1年前6瀏覽0評論

最近在做一個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報文發送完全但接收不全的問題。