J'ai un problème qui, je suppose, c'est à cause des objets que je utilise pour lire un web, dans ce cas, à la fois Retrofit2
et HttpURLConnection
. La situation est la suivante: j'ai besoin de lire un site Web sans API (pas le mien) et d'extraire tout le HTML de la page, mais j'ai des problèmes avec les deux outils que j'ai essayés (en raison du web) format.Comportement étrange lisant le code source HTML d'un web en ligne
Le web a lui-même cette balise meta:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
il montre les accents des mots avec eux (il est en espagnol). Et vous pouvez voir clairement sur le web que les accents sont joliment interprétés par Chrome, Mozilla ou tout autre navigateur:
Vous pouvez également voir la marque d'accent sur le fichier HTML:
Mais voici quand le problème me poignarde sur mon dos:
Et maintenant, je vais vous montrer ce que j'ai essayé jusqu'à présent.
Le premier appel était avec Retrofit2
.
Le client (sans convertisseur, parce que je veux cru (qui sonne mal, BTW)):
public static Retrofit getRaiaApi() {
if (raiaRetrofit == null) {
raiaRetrofit = new Retrofit.Builder()
.baseUrl(RAIA_URL)
.build();
}
return raiaRetrofit;
}
La méthode POST:
@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);
Et la appelez:
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");
}
});
}
Mais cela m'a donné, comme je l'ai déjà expliqué, le code HTML avec ces erreurs. Puis, j'ai pensé: "Eh bien, peut-être que Retrofit convertit quelque chose et ce n'est pas vraiment la source brute du web, alors essayons autre chose".
Et essayé avec un simple 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();
}
MAIS, le résultat est exactement le même:
Suis-je manque quelque chose? Dois-je utiliser un autre outil?
Le problème est du côté du serveur ... il envoie dans les caractères ISO-8859-1, mais il n'a pas mentionné à ce sujet dans l'en-tête ... – Selvin
Ouais, le problème est que le web est du gouvernement local, pas le mien, je ne peux rien changer du tout. C'est pourquoi je voulais juste lire le code source HTML, mais il n'a pas réussi je suppose. – JMedinilla
avec votre code 'HttpUrlConnection' essayer de définir le 2ème paramètre du constructeur' InputStreamReader' pour forcer l'encodage donné – Selvin