我有一个网址,可根据请求返回JSON格式的字符串
{"StockID":0,"LastTradePriceOnly":"494.92","ChangePercent":"0.48"}
我使用Java
进行流式传输InputStream in = null;
in = url.openStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
}
catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
String result = sb.toString();
但reader.readLine()
始终返回null
知道我在这里做错了吗?
这是实际的JSON地址http://app.myallies.com/api/quote/goog
更新
相同的代码在http://app.myallies.com/api/news上正常工作,尽管两个链接都具有相同的服务器实现来生成JSON响应。
答案 0 :(得分:2)
它看起来像是它想要的用户代理。以下代码适用于我:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class JSONTest {
public static void main(String[] args) throws Exception {
URL url = new URL("http://app.myallies.com/api/quote/goog");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0");
connection.setDoInput(true);
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
System.out.println(sb.toString());
}
}
答案 1 :(得分:0)
您获得null的原因是Java发出的请求与浏览器发出的请求不同。您的浏览器包含许多请求标头,除非您明确这样做,否则Java将不会填充。不过,我不确定为什么网络服务器不响应基本请求。您可以通过执行以下操作自行测试:
基本请求(无标题):
curl http://app.myallies.com/api/quote/goog
结果:null
请求标题:
curl \
-H "Host: app.myallies.com" \
-H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0" \
-H "Accept: text/html,application/xhtml,application/xml;q=0.9,*/*;q=0.8" \
-H "Accept-Language: en-US,en;q=0.5" \
-H "Accept-Encoding: gzip, deflate" \
-H "Connection: keep-alive" \
-H "Cache-Control: max-age=0" \
http://app.myallies.com/api/quote/goog`
结果:{"StockID":0,"LastTradePriceOnly":"496.38","ChangePercent":"0.78"}
您可能需要设置一些请求标头,以更接近地模仿浏览器发出的请求。