代码之家  ›  专栏  ›  技术社区  ›  shsteimer

stackexchange api的json url返回jibberish?

  •  4
  • shsteimer  · 技术社区  · 14 年前

    我有一种感觉,我在这里做了一些错误的事情,但是我不太确定我是否错过了一个步骤,或者只是有编码问题或者什么。以下是我的代码:

    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。我会在这里抄过去,但那不管用。我做错什么了?

    3 回复  |  直到 10 年前
        1
  •  5
  •   Bkkbrad    14 年前

    在这种情况下,这不是字符编码问题,而是内容编码问题;您需要文本,但服务器使用压缩来节省带宽。如果在获取该URL时查看这些头文件,则可以看到正在连接的服务器正在返回gzip内容:

    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>
    

    因此,您要么需要像stevendbrown建议的那样使用更智能的客户端,比如apache的httpclient(尽管您需要 a tweak to get it to speak Gzip automatically 或者显式解压缩示例代码中的流。对于声明输入的行,请尝试此操作:

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

    我已经验证了这对您要获取的URL有效。

        2
  •  1
  •   stevedbrown    14 年前

    使用 Apache Http Client 相反,它将正确处理字符转换。从 that site's examples :

    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/examples/org/apache/http/examples/client/ClientGZipContentCompression.java ,显示如何处理gzip内容。

        3
  •  1
  •   Trideep Rath    10 年前

    有时API调用响应被压缩,例如stackexchange API。请查看他们的文档并检查他们使用的压缩。有些使用gzip或deflate压缩。在gzip压缩的情况下,请使用以下内容。

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