Android应用程序无法读取整个HTTP响应

时间:2017-09-06 11:38:12

标签: java android json

我用Java编写了一个Web服务。此Web服务托管在TOMCAT中。我正在返回一个JSON字符串。 JSON字符串如下:

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 个答案:

答案 0 :(得分:0)

  

如何克服tomcat的限制?

Tomcat可以发送任意长度的字符串,而即使存在限制,也不会以千字节为单位进行测量,但数量级会更多。您无需克服tomcat限制。如果您的浏览器收到完整的字符串,那么任何其他应用程序都可以。

当您正在使用json.toString()时,您可以明确设置Content-Length标头,看看这是否有所不同。不要再担心Tomcat了,请仔细检查你的Android App在解析这个大小的json响应时是否有问题,或者中间的任何网络组件是否会以某种方式限制你的响应。

编辑:这不是Tomcat的问题,它在Android方面,你的答案就在对问题的评论中。

第一个问题是提出的问题是&#34;重复&#34;问题:您不能像以前那样将String与==进行比较。将else System.out.print("unexpected");添加到您的第一个if / else块以进行说明。

第二个问题是我们不知道从哪里得到is。现在看来,它可以被并行请求覆盖(它可能是一个类成员?) - 或者由于错误的字符串比较从来没有被初始化(导致你的问题,你不能看到Android端的所有内容,尽管tomcat发送它)。按照EJP在其评论中的建议,将其设为局部变量。

答案 1 :(得分: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可能尚未初始化。它似乎是一个成员变量,所以它可能仍然是null,所以此时我会期望NullPointerExceptionis当然应该是此方法中的局部变量。

  

我已经打印了此方法中收到的字符串。令人惊讶的是,此方法未收到完整字符串。

令人惊讶的是,收到了任何,如果这是您所声称的内容。我本来期待一个NPE。