JSON URL dal StackExchange API ritorno jibberish?
-
04-10-2019 - |
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?
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)));