我用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;
}
我已经打印了此方法中收到的字符串。令人惊讶的是,在此方法中未收到完整字符串。
答案 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,所以此时我会期望NullPointerException
。 is
当然应该是此方法中的局部变量。
我已经打印了此方法中收到的字符串。令人惊讶的是,此方法未收到完整字符串。
令人惊讶的是,收到了任何,如果这是您所声称的内容。我本来期待一个NPE。