我正在敲打以下代码,这些代码适用于命令行中的std java,但在运行4.2的Galaxy Nexus上无法在Android中运行。我将尝试执行帖子的两种变体包括在http://cleverbot.com/webservicemin中。原始的post逻辑取自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。 (我从经验中了解到,在移动应用中过早关闭输出流可能会关闭整个连接。)