阅读在线网络的源HTML的奇怪行为

时间:2017-10-06 09:48:10

标签: android retrofit2 httpurlconnection

我有一个问题,我想,这是因为我用来阅读网页的对象,在这种情况下,Retrofit2HttpURLConnection

情况是:我需要在没有API(不是我的)的情况下阅读网页并提取页面的整个HTML,但由于网页格式的原因,我在使用我尝试的两种工具(前面提到的)时遇到了问题

网络本身有这个元标记:

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

因此它显示了带有它们的单词的重音标记(用西班牙语表示)。您可以在网上清楚地看到Chrome,Mozilla或任何其他浏览器很好地解释了重音标记:

enter image description here

您还可以在HTML文件中看到重音符号:

enter image description here

但是问题就是这个问题刺伤了我的背后:

执行的: enter image description here

原材料: enter image description here

现在,我会告诉你到目前为止我尝试了什么。

第一个电话是Retrofit2

客户端(没有任何转换器,因为我希望它是原始的(听起来不错,顺便说一下)):

public static Retrofit getRaiaApi() {
    if (raiaRetrofit == null) {
        raiaRetrofit = new Retrofit.Builder()
                .baseUrl(RAIA_URL)
                .build();
    }
    return raiaRetrofit;
}

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);

电话

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");
        }
    });
}

但正如我之前解释的那样,这给了我带有这些错误的HTML。

然后,我想:“好吧,也许Retrofit正在转换一些东西,这不是网络的原始来源,所以让我们尝试别的东西”。

并尝试使用简单的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();
}

但结果完全相同:enter image description here

我错过了什么吗?我应该使用其他工具吗?

2 个答案:

答案 0 :(得分:2)

您可以使用InputStreamReader指定服务器提供的编码。

例如:

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

我希望它有效

答案 1 :(得分:0)

你试过使用输出字符串吗?

这样的东西
String html = new String(response.toString().getBytes(), "UTF-8");