Frage

Ich habe das Gefühl, ich bin hier etwas falsch zu machen, aber ich bin mir nicht ganz sicher, ob ich einen Schritt fehlt bin, oder bin nur ein Codierungsproblem oder etwas habe. Hier ist mein 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);
   }

Wenn ich Inhalt drucken, erhalte ich eine ganze Reihe von wingdings und Sonderzeichen, im Grunde jibberish. Ich würde kopieren und es hier, aber das funktioniert nicht. Was mache ich falsch?

War es hilfreich?

Lösung

In diesem Fall ist es nicht ein Zeichen Problem kodiert, ist es ein Inhaltscodierung Problem; Sie erwarten Text, aber der Server-Komprimierung wird verwendet um Bandbreite zu sparen. Wenn Sie sich die Header aussehen, wenn Sie diese URL greifen, können Sie sehen, der Server, den Sie verbinden kehrt gzipped Inhalt:

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>

So benötigen Sie entweder eine intelligentere Client wie Httpclient von Apache zu verwenden, wie stevedbrown schlägt vor (obwohl Sie brauchen,

Andere Tipps

Mit dem Apache Http Clienten statt, es wird richtig kümmern Zeichenkonvertierungen. Von , die Website Beispiele :

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 diesem Fall finden Sie unter http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/ Beispiele / client / ClientGZipContentCompression.java , die zeigt, wie mit gzip-Inhalt behandeln.

Manchmal ist die API-Aufruf Antwort komprimiert zB. Stack API. Bitte gehen Sie durch ihre Dokumentation und prüfen, ob die Komprimierung sie verwenden. Einige verwenden entweder GZIP oder DEFLATE compression.In Fall von GZIP-Komprimierung die folgenden.

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top