Question

Je sens que je fais quelque chose de mal, mais je ne suis pas tout à fait sûr si je manque une étape, ou je suis juste avoir un problème d'encodage ou quelque chose. Voici mon code:

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

Quand j'imprimer le contenu, je reçois un tas de Wingdings et des caractères spéciaux, essentiellement charabia. Je copie et passé ici, mais qui ne fonctionne pas. Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Dans ce cas, il est pas un problème du codage des caractères, il est un problème de codage de contenu; vous attendez texte, mais le serveur utilise la compression pour économiser la bande passante. Si vous regardez les en-têtes lorsque vous prenez cette URL, vous pouvez voir le serveur auquel vous vous connectez retourne le contenu 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>

Vous avez besoin soit d'utiliser un client plus intelligent comme HttpClient Apache comme le suggère stevedbrown (même si vous avez besoin

Autres conseils

Utilisez il va prendre soin des conversions de caractères correctement Apache Http client à la place,. les exemples de ce site :

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

Dans ce cas, voir http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/ examples / client / ClientGZipContentCompression.java , qui montre comment faire face à un contenu Gzip.

Parfois, la réponse d'appel de l'API sont par exemple comprimé. API StackExchange. S'il vous plaît passer par leur documentation et vérifier la compression qu'ils utilisent. Certains utilisent les deux cas GZIP ou DEFLATE compression.In de compression GZIP utiliser ce qui suit.

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top