2017-09-06 55 views
-3

我已经用Java编写了一个Web服务。这个网络服务托管在TOMCAT中。我返回一个JSON字符串。 JSON字符串如下:Android应用程序不读取整个HTTP响应

accountDetailsNodes = [{mobileNumber=01948330292, errorMessage=null, customerCode=59744000002, photo=a string of 35536 charaters , accountOpenDate=null, errorFlag=N, customerNumber=4, customerName=Md. Saifur Hossain , accountID=2, accountTypeId=13, accountTypeDescription=Savings Account, customerPointId=1, balance=100000037640.50, accountTile=Md. Saifur Hossain}] 

JSON字符串的长度是32613.但充分反应不来Android应用。我认为从Tomcat发送响应可能会有一些限制。我怎样才能克服Tomcat的这个限制?

更新时间:

这是我的代码来生成JSON。

try { 
      List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); 
      JSONObject json = new JSONObject(); 
      CashDepositDao dao = new CashDepositDao(); 
      for (CashDepositModel bo : dao.getAccountDetals(accountNo,branchCode)) { 
       Map<String, Object> map = new HashMap<String, Object>(); 
       map.put("accountTile", bo.getAccountTitle()); 
       map.put("accountOpenDate", bo.getAccountOpenDate()); 
       map.put("mobileNumber", bo.getMobileNumber()); 
       map.put("balance", bo.getBalance()); 
       map.put("accountTypeId", bo.getAccountTypeID()); 
       map.put("accountTypeDescription", bo.getAccountTypeDescription()); 
       map.put("accountID", bo.getAccountID()); 
       map.put("customerNumber", bo.getCustomerNumber()); 
       map.put("customerCode", bo.getCustomerCode()); 
       map.put("customerName", bo.getCustomerName()); 
       map.put("customerPointId", bo.getCustomerPointID()); 
       map.put("photo", bo.getPhoto()); 
       map.put("errorMessage", bo.getErrorMessage()); 
       map.put("errorFlag", bo.getErrorFlage()); 

       list.add(map); 
       json.put("accountDetailsNodes", list); 

      } 
      System.out.println("accountDetailsNodes = " + list); 
      response.addHeader("Access-Control-Allow-Origin", "*"); 
      response.setContentType("application/json"); 
      response.setCharacterEncoding("UTF-8"); 
      response.getWriter().print(json.toString()); 
      response.getWriter().flush(); 
      // System.out.println("Response Completed... "); 
     } catch (Exception ex) { 
      Logger.getLogger(SourecAccountDetailsSV.class.getName()).log(Level.SEVERE, null, ex); 
     } 

发送和从移动应用获取响应:

我发送和使用下面的代码得到响应:

public JSONObject makeHttpRequest(String url, String method, 
      List<NameValuePair> params) { 

     // Making HTTP request 
     try { 

      // check for request method 
      if(method == "POST"){ 
       // request method is POST 
       // defaultHttpClient 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(url); 
       httpPost.setEntity(new UrlEncodedFormEntity(params)); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 

      }else if(method == "GET"){ 
       // request method is GET 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       String paramString = URLEncodedUtils.format(params, "utf-8"); 
       url += "?" + paramString; 
       HttpGet httpGet = new HttpGet(url); 
       HttpResponse httpResponse = httpClient.execute(httpGet); 
       HttpEntity httpEntity = httpResponse.getEntity(); 
       is = httpEntity.getContent(); 
      }   

     } catch (UnsupportedEncodingException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      is.close(); 
      json = sb.toString(); 
      System.out.println(json); 
     } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
     } 

     // try parse the string to a JSON object 
     try { 
      jObj = new JSONObject(json); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     // return JSON String 
     return jObj; 

    } 

我已经印在该方法中获得的字符串。令人惊讶的是,这种方法没有收到完整的字符串。

+2

而且我认为您没有显示的代码中可能存在一些错误。 – blafasel

+0

问题已更新。我检查了webservice中的json字符串。在android应用程序中显示完整的字符串,完整的字符串不显示。 –

+0

**什么** Android应用程序? – EJP

回答

0

我该如何克服这个tomcat的局限性?

的Tomcat可以发送任意长度的字符串,并即使有一个限制,它不会以千字节,但在几个数量级测量。没有你需要克服的tomcat限制。如果您的浏览器收到完整的字符串,其他应用程序也可以收到。

正如你使用json.toString()总之,你可以明确地设置Content-Length标题,看看这是否有所不同。不要担心Tomcat,并仔细检查你的Android应用程序是否有解析此大小的json响应的问题,或者是否有任何网络组件以某种方式限制你的响应。

编辑:这不是Tomcat的问题,它在Android的一面,你的回答是在问题的评论。

第一个问题是在什么提议作为“重复”的问题:你不能比较字符串与==像你一样。将else System.out.print("unexpected");添加到您的第一个if/else块来说明。

第二个问题是我们不知道从哪里得到is。现在看起来,它可能被并行请求(它可能是一个类成员?)所覆盖 - 或由于字符串比较错误,根本不会初始化(导致您的问题,您根本无法看到任何内容) Android方面,尽管tomcat发送它)。如EJP在他/她的评论中所建议的那样,将其作为局部变量。

+0

servlet容器自动设置'Content-length'。自己设置它不会有什么区别。它将被容器覆盖。 – EJP

0

我觉得Tomcat发送响应可能会有一些限制。

没有。

我该如何克服Tomcat的这个限制?

没有这样的限制。

我发送和使用下面的代码得到响应:

public JSONObject makeHttpRequest(String url, String method, 
      List<NameValuePair> params) { 

     // Making HTTP request 
     try { 

      // check for request method 
      if(method == "POST"){ 

在这里,你是不正确的比较字符串。您应该使用equals(),而不是==

   // ... 
      }else if(method == "GET"){ 

同上。

 try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 

这里您使用的是is,它可能根本没有被初始化。它似乎是一个成员变量,所以它可能仍然是空的,所以在这一点上,我期望NullPointerExceptionis当然应该是这种方法中的局部变量。

我已打印在此方法中收到的字符串。令人惊讶的是,这种方法没有收到完整的字符串。

令人惊讶的是,什么被接收,如果这就是你自称什么。我会期待一个NPE。

+0

字符串被部分接收。来自web服务的json字符串的总字符是32613。但在Android应用程序中,只有4567个字符被收到。 –