我正在做一个简单的http get,
我在结果上看到一个不完整的回复, 我做错了什么?
这里是代码:
class GetDocuments extends AsyncTask<URL, Void, Void> {
@Override
protected Void doInBackground(URL... urls) {
Log.d("mensa", "bajando");
//place proper url
connect(urls);
return null;
}
public static void connect(URL[] urls)
{
HttpClient httpclient = new DefaultHttpClient();
// Prepare a request object
HttpGet httpget = new HttpGet("http://tiks.document.dev.chocolatecoded.com.au/documents/api/get?type=tree");
// Execute the request
HttpResponse response;
try {
response = httpclient.execute(httpget);
// Examine the response status
Log.d("mensa",response.getStatusLine().toString());
// Get hold of the response entity
HttpEntity entity = response.getEntity();
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
// A Simple JSON Response Read
InputStream instream = entity.getContent();
String result= convertStreamToString(instream);
// now you have the string representation of the HTML request
Log.d("mensa", "estratagema :: "+result);
JSONObject jObject = new JSONObject(result);
Log.d("mensa", "resposta jObject::"+jObject);
Log.d("mensa", "alive 1");
JSONArray contacts = null;
contacts = jObject.getJSONArray("success");
Log.d("mensa", "resposta jObject::"+contacts);
Log.d("mensa", "alive");
//instream.close();
}
} catch (Exception e) {}
}
private static String convertStreamToString(InputStream is) {
/*
* To convert the InputStream to String we use the BufferedReader.readLine()
* method. We iterate until the BufferedReader return null which means
* there's no more data to read. Each line will appended to a StringBuilder
* and returned as String.
*/
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
Log.d("mensa", "linea ::"+line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}
}
我称之为:
GetDocuments get = new GetDocuments();
URL url = null;
try {
url = new URL("ftp://mirror.csclub.uwaterloo.ca/index.html");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//URL url = new URL("http://www.google.es");
get.execute(url);
编辑1 我将不完整称为被截断的响应?
请在下面的图片中注意字符串被截断的响应,
这是因为日志大小?, 但另一个问题是它没有解析?
谢谢!
答案 0 :(得分:2)
我不知道这是否可以解决您的问题,但您可以摆脱您的方法并简单地使用:
String responseString = EntityUtils.toString(response.getEntity());
答案 1 :(得分:1)
在过去的几天里,我遇到了完全相同的问题。我发现我的代码通过WiFi而不是3G工作。换句话说,我删除了所有通常的线程候选者。我还发现,当我在调试器中运行代码并在client.execute(...)之后等待(比如说)10秒后,它就可以了。
我猜是
response = httpclient.execute(httpget);
本身就是一个异步调用,当它缓慢返回一个部分结果时...因此JSON反序列化出错了。
相反,我尝试使用回调函数执行此版本的执行...
try {
BasicResponseHandler responseHandler = new BasicResponseHandler();
String json = httpclient.execute(httpget, responseHandler);
} finally {
httpclient.close();
}
突然之间一切正常。如果您不想要字符串,或者想要自己的代码,那么请查看ResponseHandler接口。希望有所帮助。
答案 2 :(得分:1)
我已经确认这是因为java字符串的大小限制。我通过添加带有ressponse的字符串“abcd”并在logcat中打印响应字符串来检查这一点。但结果是截断的respose没有添加字符串“abcd”。
那是
try {
BasicResponseHandler responseHandler = new BasicResponseHandler();
String json = httpclient.execute(httpget, responseHandler);
json= json+"abcd";
Log.d("Json ResponseString", json);
} finally {
httpclient.close();
}
所以我放了一个arrayString来收集响应。为了制作数组,我使用“}”
分割了我的json格式响应下面给出了代码(这只是一个解决方法)
BasicResponseHandler responseHandler = new BasicResponseHandler();
String[] array=client.execute(request, responseHandler).split("}");
然后,您可以使用自定义类将每个对象解析为json对象和json数组。
如果你有任何其他好的方法来存储响应,请分享,因为我正在为每个不同的json响应创建自定义方法);。
谢谢
曼阿尔沙
答案 3 :(得分:1)
您好我正在使用Gson库来处理响应。
http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html
由于 艾尔沙德
答案 4 :(得分:1)
由于声誉,我不能直接评论,但是为了回应https://stackoverflow.com/a/23247290/4830567我觉得我应该指出Java String的大小限制大约是2GB(Integer.MAX_VALUE)所以这不是原因这里的截断。
根据https://groups.google.com/d/msg/android-developers/g4YkmrFST6A/z8K3vSdgwEkJ,logcat具有大小限制,这就是为什么附加“abcd”并在logcat中打印不起作用的原因。 String本身会有附加的字符。之前链接的讨论还提到,HTTP协议本身的大小限制有时可能是一个因素,但大多数服务器和客户端在内部处理此约束,以便不将其暴露给用户。