JSON URL von Stack API Rückkehr jibberish?
-
04-10-2019 - |
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?
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)));