Http POST适用于std Java在Android上无法正常工作

时间:2013-02-18 18:30:28

标签: java android http

我正在敲打以下代码,这些代码适用于命令行中的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。 (我从经验中了解到,在移动应用中过早关闭输出流可能会关闭整个连接。)

0 个答案:

没有答案