Ich habe ein Problem, das, glaube ich, liegt an den Objekten, die ich benutze, um ein Web zu lesen, in diesem Fall sowohl Retrofit2
als auch HttpURLConnection
.Seltsames Verhalten beim Lesen der Quell-HTML eines Online-Webs
Die Situation ist: Ich muss ein Web ohne eine API (nicht meins) lesen und den gesamten HTML der Seite extrahieren, aber ich habe Probleme mit beiden Tools, die ich (die zuvor genannten) wegen des Webs versucht Format.
Die Bahn selbst hat diese Meta-Tag:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
so zeigt es die Akzentzeichen der Wörter mit ihnen (es ist in Spanisch). Und Sie können im Web deutlich sehen, dass Akzentzeichen schön von Chrome interpretiert werden, Mozilla oder einen anderen Browser:
Sie können auch die Akzentzeichen auf der HTML-Datei:
Aber hier ist, wenn das Problem mich auf den Rücken sticht:
Und jetzt, ich werde Ihnen zeigen, was ich bisher ausprobiert.
Der erste Anruf war mit Retrofit2
.
Der Client (ohne Konverter, weil ich es will roh (das klingt schlecht, btw)):
public static Retrofit getRaiaApi() {
if (raiaRetrofit == null) {
raiaRetrofit = new Retrofit.Builder()
.baseUrl(RAIA_URL)
.build();
}
return raiaRetrofit;
}
Die POST-Methode:
@Headers({
"Content-Type: application/x-www-form-urlencoded;charset=utf-8"
})
@FormUrlEncoded
@POST("index.php?operacion=consulta")
Call<ResponseBody> postRaiaSearch(@Header("Cookie") String cookie, @Field("microchip") String microchip);
Und der Anruf:
private void nextRaiaSearch(String sessionCookie) {
callRaiaSearch = apiInterfaceRaia.postRaiaSearch(sessionCookie, chipInput);
callRaiaSearch.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.v("call", "onResponse");
try {
String html = response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.v("call", "onFailure");
}
});
}
Aber das gab mir, wie ich schon vorher erklärt habe, das HTML mit diesen Fehlern.
Dann dachte ich: "Nun, vielleicht wird Retrofit etwas konvertieren und das ist nicht wirklich die rohe Quelle des Webs, also lasst uns etwas anderes ausprobieren."
Und versuchte es mit einem einfachen HttpURLConnection
.
private void nextRaiaSearch(String sessionCookie) throws IOException {
URL url = new URL("https://www.raia.es/index.php?operacion=consulta");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
OutputStreamWriter request;
StringBuilder response = new StringBuilder();
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Cookie", sessionCookie);
connection.setRequestMethod("POST");
connection.setConnectTimeout(60000);
connection.setReadTimeout(10000);
request = new OutputStreamWriter(connection.getOutputStream());
request.write("microchip=" + chipInput);
request.flush();
request.close();
String line;
InputStreamReader input = new InputStreamReader(connection.getInputStream());
BufferedReader reader = new BufferedReader(input);
while ((line = reader.readLine()) != null) {
response.append(line).append("\n");
}
input.close();
reader.close();
String html = response.toString();
}
ABER, das Ergebnis ist genau das gleiche:
bin ich etwas fehlt? Sollte ich ein anderes Werkzeug verwenden?
Das Problem ist die Server-Seite funktioniert ... es sendet Zeichen in ISO-8859-1 aber darüber im Header nicht erwähnt ... – Selvin
Ja, das Problem ist, dass das Web von der lokalen Regierung ist, nicht meins, ich kann überhaupt nichts ändern. Deshalb wollte ich nur die Quell-HTML lesen, aber es gelingt mir nicht. – JMedinilla
mit Ihrem 'HttpUrlConnection'-Code versuchen, den 2. Parameter des 'InputStreamReader'-Konstruktors zu setzen, um die gegebene Kodierung zu erzwingen – Selvin