Pregunta

Tengo la sensación de que estoy haciendo algo mal aquí, pero no estoy muy seguro de si me falta un paso, o estoy sólo tener un problema de codificación o algo así. Aquí está mi código:

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

Al imprimir el contenido, me sale un montón de wingdings y caracteres especiales, básicamente jibberish. Me gustaría copiar y pegar aquí, pero que no está funcionando. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

En este caso no es una codificación de caracteres problema, es un problema de codificación de contenido; usted está esperando texto, pero el servidor utiliza la compresión para ahorrar ancho de banda. Si nos fijamos en las cabeceras cuando agarras esa URL, se puede ver el servidor que se está conectando está volviendo contenido 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>

Así que o bien es necesario utilizar un cliente inteligente como la de Apache HttpClient como stevedbrown sugiere (aunque es necesario un pellizco para conseguir que se hable de forma automática Gzip ), o descomprimir de manera explícita la corriente que tienes en el código de ejemplo. Prueba este lugar para la línea en la que declara su entrada:

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

He verificado que esto funciona para la dirección URL que están tratando de agarrar.

Otros consejos

Utilice el Apache HTTP de cliente lugar, que va a hacerse cargo de las conversiones de caracteres correctamente. De ejemplos de ese sitio :

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

En este caso, consulte http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/ ejemplos / cliente / ClientGZipContentCompression.java , que muestra cómo tratar con el contenido gzip.

por ejemplo veces la respuesta de llamada a la API se comprimen. API StackExchange. Por favor, vaya a través de su documentación y comprobar la compresión que están utilizando. Algunos utilizan cualquiera de los casos GZIP o desinflar compression.In de compresión GZIP utilice la siguiente.

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top