我正在研究以下代码,这些代码在命令行中适用于 std java,但在运行 4.2 的 Galaxy Nexus 上的 Android 中不起作用。我在尝试向http://cleverbot.com/webservicemin发布帖子时包含了两种变体。最初的帖子逻辑取自chatterbot API,修改后的逻辑是我尝试使用 Java 中可用的不同 Http API。这是在测试项目中包含chatterbot API的天真尝试。原始应用程序使用标准 Java 在 cmd 行上的主应用程序中工作,而这两个版本都不能在 Android 中工作。
private static String revisedPostLogic(String url, Map<String, String> parameters) throws IOException {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(parameters.size());
for(Map.Entry<String,String>eachEntry : parameters.entrySet())
nameValuePairs.add(new BasicNameValuePair(eachEntry.getKey(),eachEntry.getValue()));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httpPost);
ByteArrayOutputStream rawResponse = new ByteArrayOutputStream();
response.getEntity().writeTo(rawResponse);
return rawResponse.toString();
}
private static String old_post_logic(String url, Map<String, String> parameters) throws Exception {
URLConnection connection = new URL(url).openConnection();
((HttpURLConnection) connection).setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream());
osw.write(parametersToWWWFormURLEncoded(parameters));
osw.flush();
osw.close();
Reader r = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringWriter w = new StringWriter();
char[] buffer = new char[1024];
int n = 0;
while ((n = r.read(buffer)) != -1) {
w.write(buffer, 0, n);
}
r.close();
return w.toString();
}
使用修改后的逻辑,我得到服务器异常的无响应,而使用原始逻辑,我得到一个 EOFException。
更新
我尝试从 Android 和桌面 Java 运行它,但我得到了一个差异:
new java.net.URL("http://cleverbot.com/webservicemin").openConnection().getResponseCode()
在桌面 Java 上,我得到一个响应代码 200。(我没有尝试读取流,但我猜它会返回文本“DENIED”)在 Android 上,我得到“EOFException”。在桌面 Java 上(现在使用 Groovy 作为快捷方式),我转储响应代码、标头和响应内容,我得到:
response code: 200
Headers: [null:[HTTP/1.1 200 OK], SC:[6870], RPS:[server52054], MIME-Version:[1.0], Content-Length:[29], Expires:[Mon, 18 Feb 2013 20:07:20 GMT], Set-Cookie:[RPS=server52054, JSESSIONID=6C765C93A085F67D69F800D9EB76646C; Path=/], Connection:[keep-alive], Server:[Jabberwacky], RLM:[2416], Cache-Control:[no-cache;no-store], Pragma:[no-cache], Date:[Mon, 18 Feb 2013 19:56:42 GMT], Content-Type:[text/html;charset=iso-8859-1]]
Response: DENIED
如果我在 Android 上尝试同样的操作,我再次无法通过响应代码。我可以在没有路径的情况下毫无问题地连接到根 URL,只是当我尝试从根 url 中击中路径时,当我使用 GET 或 POST 获得 EOFException 时。我还尝试将 outputstreamwriter close() 调用移到最后,这样我就可以在关闭输出流之前读取响应代码。在这种情况下,我仍然得到 EOFException 。(我从经验中了解到,在移动应用程序中过早关闭输出流可能会关闭您的整个连接。)