Domanda

Ho la sensazione che sto facendo qualcosa di sbagliato qui, ma non sono del tutto sicuro se mi manca un passo, o sono solo che hanno un problema di codifica o qualcosa del genere. Ecco il mio codice:

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

Quando stampo contenuti, ho un sacco di wingdings e caratteri speciali, fondamentalmente jibberish. Vorrei copiare e incollare qui, ma che non funziona. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

In questo caso non è un carattere codifica problema, è un problema di codifica dei contenuti; sei in attesa del testo, ma il server utilizza la compressione per risparmiare larghezza di banda. Se si guardano le intestazioni quando si afferra che URL, è possibile visualizzare il server ci si connette a sta tornando contenuto compresso:

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>

Quindi, si sia bisogno di usare un client intelligente come quello di Apache HttpClient come suggerisce stevedbrown (anche se è necessario un tweak per farlo parlare Gzip automaticamente ), o decomprimere esplicitamente il flusso avete ottenuto in il codice di esempio. Prova a modificare la riga in cui si dichiara il vostro input:

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

Ho verificato che questo funziona per l'URL che si sta cercando di afferrare.

Altri suggerimenti

Utilizza la Apache Http client invece, sta andando a prendersi cura di conversione dei caratteri in modo corretto. Da esempi di quel sito :

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

In questo caso, vedere http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/ examples / client / ClientGZipContentCompression.java , che mostra come trattare i contenuti Gzip.

A volte ad esempio la risposta chiamata API vengono compressi. StackExchange API. Si prega di passare attraverso la loro documentazione e verificare per la compressione che stanno utilizzando. Alcuni usano entrambi i casi GZIP o sgonfiare compression.In di compressione GZIP utilizzare il seguente.

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top