我有一个问题,我想,这是因为我用来阅读网页的对象,在这种情况下,Retrofit2
和HttpURLConnection
。
情况是:我需要在没有API(不是我的)的情况下阅读网页并提取页面的整个HTML,但由于网页格式的原因,我在使用我尝试的两种工具(前面提到的)时遇到了问题
网络本身有这个元标记:
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
因此它显示了带有它们的单词的重音标记(用西班牙语表示)。您可以在网上清楚地看到Chrome,Mozilla或任何其他浏览器很好地解释了重音标记:
您还可以在HTML文件中看到重音符号:
但是问题就是这个问题刺伤了我的背后:
现在,我会告诉你到目前为止我尝试了什么。
第一个电话是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();
}
我错过了什么吗?我应该使用其他工具吗?
答案 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");