我感觉自己在这里做错了什么,但是我不确定我是否错过了一步,或者只是遇到编码问题或其他问题。这是我的代码:

URL url = new URL("http://api.stackoverflow.com/0.8/questions/2886661");

   BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
   // Question q = new Gson().fromJson(in, Question.class);
   String line;
   StringBuffer content = new StringBuffer();
   while ((line = in.readLine()) != null)
   {
    content.append(line);
   }

当我打印内容时,我会得到一大堆翅膀和特殊角色,基本上是jibberish。我会在这里复制并经过它,但这不起作用。我究竟做错了什么?

有帮助吗?

解决方案

在这种情况下,这不是字符编码问题,而是一个编码问题。您期望文本,但是服务器正在使用压缩来节省带宽。如果您抓住该URL时查看标题,您可以看到要连接的服务器正在返回GZPICTEND内容:

GET /0.8/questions/2886661 HTTP/1.1
Host: api.stackoverflow.com

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 22 May 2010 15:51:34 GMT
Content-Type: application/json; charset=utf-8
<more headers>
Content-Encoding: gzip
<more headers>

因此,您要么需要像StevedBrown所建议的那样使用Apache的HTTPClient这样的智能客户端(尽管您需要 调整以使其自动说话),或明确解压缩您在示例代码中获得的流。改用此操作以获取声明输入的行:

 BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(url.openStream())));

我已经确认这适用于您要抓取的URL。

其他提示

使用 Apache HTTP客户端 相反,它将正确照顾角色转换。从 该网站的示例:

public final static void main(String[] args) throws Exception {

    HttpClient httpclient = new DefaultHttpClient();

    HttpGet httpget = 
        new HttpGet("http://api.stackoverflow.com/0.8/questions/2886661"); 

    System.out.println("executing request " + httpget.getURI());

    // Create a response handler
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    String responseBody = httpclient.execute(httpget, responseHandler);
    System.out.println(responseBody);

    System.out.println("----------------------------------------");

    // When HttpClient instance is no longer needed, 
    // shut down the connection manager to ensure
    // immediate deallocation of all system resources
    httpclient.getConnectionManager().shutdown();        
}

在这种情况下,请参阅 http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/src/examples/org/org/opache/http/http/http/examples/exmples/client/client/client/client/client/client/clientgzipcontentcompcompompression.java.java.java.jjava.jjava.jjava.jjava.jjava.易, ,其中显示了如何处理GZIP内容。

有时,API呼叫响应是压缩的。 Stackexchange API。请浏览他们的文档并检查他们使用的压缩。有些人使用GZIP或Deflate Compression。在GZIP压缩的情况下,使用以下内容。

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top