我使用HttpUrlConnection向服务器发出GET请求。 连接后:
我得到输入流,没有抛出异常,但是:
{“name”:“我的名字”,“生日”:“01/01/1970”,“id”:“100002215110084”}
要遵循的任何提示或追踪?感谢。
编辑:这是代码
请注意:我使用import java.net.HttpURLConnection;
这是标准
http Java库。 我不想使用任何其他外部库。事实上
我在android中使用来自apache的库httpclient时遇到了问题(他们的一些匿名.class不能被apk编译器使用)。
嗯,代码:
URLConnection theConnection;
theConnection = new URL("www.example.com?query=value").openConnection();
theConnection.setRequestProperty("Accept-Charset", "UTF-8");
HttpURLConnection httpConn = (HttpURLConnection) theConnection;
int responseCode = httpConn.getResponseCode();
String responseMessage = httpConn.getResponseMessage();
InputStream is = null;
if (responseCode >= 400) {
is = httpConn.getErrorStream();
} else {
is = httpConn.getInputStream();
}
String resp = responseCode + "\n" + responseMessage + "\n>" + Util.streamToString(is) + "<\n";
return resp;
我明白了:
200
OK
回应的主体
但仅
200 行
在android
中答案 0 :(得分:12)
尝试Tomislav的代码我得到了答案。
我的函数streamToString()使用.available()来检测是否收到任何数据, 它在Android中返回0。当然,我打电话太快了。
如果我更喜欢使用readLine():
class Util {
public static String streamToString(InputStream is) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
}
然后,它等待数据到达。
感谢。
答案 1 :(得分:4)
您可以尝试使用此代码返回String中的响应:
public String ReadHttpResponse(String url){
StringBuilder sb= new StringBuilder();
HttpClient client= new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
try {
HttpResponse response = client.execute(httpget);
StatusLine sl = response.getStatusLine();
int sc = sl.getStatusCode();
if (sc==200)
{
HttpEntity ent = response.getEntity();
InputStream inpst = ent.getContent();
BufferedReader rd= new BufferedReader(new InputStreamReader(inpst));
String line;
while ((line=rd.readLine())!=null)
{
sb.append(line);
}
}
else
{
Log.e("log_tag","I didn't get the response!");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
答案 2 :(得分:0)
Stream数据可能尚未准备好,因此您应在循环中检查流中的数据是否可用,然后再尝试访问它。 数据准备好后,您应该读取它并存储在另一个地方,例如字节数组;二进制流对象是将数据读取为字节数组的不错选择。字节数组是一个更好的选择的原因是因为数据可能是二进制数据,例如图像文件等。
InputStream is = httpConnection.getInputStream();
byte[] bytes = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] temp = new byte[is.available()];
while (is.read(temp, 0, temp.length) != -1) {
baos.write(temp);
temp = new byte[is.available()];
}
bytes = baos.toByteArray();
在上面的代码中,bytes
是字节数组的响应。如果它是文本数据,则可以将其转换为字符串,例如utf-8编码的文本数据:
String text = new String(bytes, Charset.forName("utf-8"));