2010-05-22 3 views
4

나는 여기서 뭔가 잘못하고있는듯한 느낌이 들지만, 단계를 놓치고 있는지, 아니면 단지 인코딩 문제가있는 것인지 확실하지 않습니다. 여기 내 코드는 : 나는 내용을 인쇄 할 때StackExchange에서 가져온 JSON URL이 이상하게 보입니까?

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); 
    } 

, 내가 Wingdings를 특수 문자, 기본적으로 jibberish의 전체 무리를 얻을. 나는 복사하여 여기를 지나칠 것이지만 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

5

이 경우 문자 인코딩 문제가 아니며 콘텐츠 인코딩 문제입니다. 당신은 텍스트를 기대하고 있지만 서버는 대역폭을 절약하기 위해 압축을 사용하고 있습니다. (비록

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> 

는 그래서 하나가 아파치 HttpClient를 stevedbrown에서 알 수 있듯이 같은 스마트 클라이언트를 사용합니다 : 당신이 URL을 잡을 때 헤더를 보면, 당신은 당신이에 연결하는 서버가 gzip으로 압축 된 내용을 반환 볼 수 있습니다 a tweak to get it to speak Gzip automatically) 또는 예제 코드에있는 스트림을 명시 적으로 압축 해제하십시오. 입력을 선언 한 행 대신 다음을 시도하십시오.

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

나는이 URL이 작동하는 것으로 확인되었습니다.

1

문자 대신 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();   
} 

이 경우, Gzip으로 콘텐츠를 처리하는 방법을 보여주는, http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/examples/client/ClientGZipContentCompression.java를 참조하십시오.

+0

이렇게하면 api.stackoverflow.com에서 반환하는 콘텐츠의 압축을 풀지 못하는 문제는 해결되지 않습니다. – Bkkbrad

1

간혹 API 호출 응답이 압축되는 경우가 있습니다. StackExchange API. 그들의 문서를보고 그들이 사용하는 압축을 확인하십시오. 일부는 GZIP 또는 DEFLATE 압축을 사용합니다. GZIP 압축의 경우 다음을 사용하십시오.

InputStream is = new URL(url).openStream(); 
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is))); 
관련 문제