我已经在SO(here的其中一个)上发现了一些关于此问题的问题,但是我无法弄清楚为什么在Android上运行代码时会引发异常而不是在使用JRE时引发异常在我的电脑上(Windows)。我使用完全相同的代码和库。
这是抛出异常的代码(某些变量在此范围之前声明):
URL url = new URL(urlString);
conn = (HttpsURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
conn.setRequestProperty("User-Agent", userAgent);
conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
conn.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
if (cookies != null) {
for (String cookie : this.cookies) {
conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
}
}
int responseCode = conn.getResponseCode();
Log.d(TAG, "Response code: " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
setCookies(conn.getHeaderFields().get("Set-Cookie"));
return response.toString();
在conn.getResponseCode
上抛出异常(如果删除,它也会在conn.getInputStream
上抛出)。这是堆栈跟踪:
28939-28998/com.example.www W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:454)
28939-28998/com.example.www W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:348)
28939-28998/com.example.www W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:520)
28939-28998/com.example.www W/System.err: at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
28939-28998/com.example.www W/System.err: at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:25)
由于我没有将请求发送到我的服务器而是模拟浏览器,因此无法对服务器代码进行更改。
知道为什么这会在Android上发生,而它在我的电脑上运行顺畅吗?我正在考虑为HTTP请求尝试一个不同的库(也许是Basic HTTP Client),但我担心这会产生相同结果的枯燥工作。我还考虑过增加重定向限制,但这似乎是一个糟糕的解决方法。
提前致谢!