2017-10-06 5 views
0

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:

enter image description here

Vous pouvez également voir la marque d'accent sur le fichier HTML:

enter image description here

Mais voici quand le problème me poignarde sur mon dos:

Exécuté: enter image description here

Raw: enter image description here

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: enter image description here

Suis-je manque quelque chose? Dois-je utiliser un autre outil?

+0

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

+0

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

+1

avec votre code 'HttpUrlConnection' essayer de définir le 2ème paramètre du constructeur' InputStreamReader' pour forcer l'encodage donné – Selvin

Répondre

2

Vous pouvez utiliser InputStreamReader pour spécifier l'encodage proposé par le serveur.

Par exemple:

InputStreamReader input = new InputStreamReader(connection.getInputStream(), Charset.forName("ISO-8859-1")); 

J'espère que cela fonctionne

0

avez-vous essayé de jouer avec la sortie String?

Quelque chose comme

String html = new String(response.toString().getBytes(), "UTF-8"); 
+0

J'ai déjà essayé d'utiliser ce jeu de caractères sans écrire de jeu de caractères, mais les en-têtes de requête ne changent rien à la réponse. – JMedinilla

+0

a donné une autre réponse à ma réponse –

+0

C'était la première chose que j'ai essayé. Mais quand vous avez la réponse, il a déjà les erreurs, donc changer le jeu de caractères ne fera rien. Merci pour la réponse de toute façon. – JMedinilla