Вопрос

У меня есть ощущение, что я делаю что-то не так, но я не совсем уверен, если мне не хватает шага, или просто проблема кодирования или что-то в этом роде. Вот мой код:

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 и специальные персонажи, в основном дрожание. Я бы скопировал и прошел здесь здесь, но это не работает. Что я делаю неправильно?

Это было полезно?

Решение

В этом случае это не проблема кодирования символов, это проблема кодирования контента; Вы ожидаете текста, но сервер использует сжатие для сохранения полосы пропускания. Если вы посмотрите на заголовки, когда вы схватите этот URL, вы можете увидеть сервер, который вы подключаетесь к возврату GZuпленному контенту:

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>

Таким образом, вам либо нужно использовать более разумный клиент, такой как httpChicient Apache, поскольку STEVEDBROWN предлагает (хотя вам нужно твик, чтобы получить его, чтобы автоматически говорить Гжип), или явно распаковать поток, который вы попали в ваш пример код. Попробуйте это вместо этого для линии, где вы объявляете свой вклад:

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

Я проверил, что это работает для URL-адреса, которую вы пытаетесь захватить.

Другие советы

Использовать Apache HTTP Client. Вместо этого он будет позаботиться о преобразованиях характера правильно. От Примеры этого сайта:

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/example/org/apache/http/examples/Client/ClientGZIPContentCompression.java, который показывает, как бороться с содержанием GZIP.

Иногда реагирование вызова API сжаты, например, Stackexchange API. Пожалуйста, пройдите свою документацию и проверьте наличие сжатия, которые они используют. Некоторые используют либо GZIP, либо сжатие сжатия. В случае сжатия GZIP используют следующее.

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top