尽管setDoOutput(true)和setRequestMethod(“POST”),HttpURLConnection始终执行GET请求而不是POST请求

时间:2012-04-29 17:31:07

标签: java android http android-4.0-ice-cream-sandwich

自更新到Ice Cream Sandwich以来,我的POST请求不再有效。在ICS之前,这很好用:

try {
        final URL url = new URL("http://example.com/api/user");
        final HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setRequestMethod("POST");
        connection.setDoOutput(false);
        connection.setDoInput(true);
        connection.setRequestProperty("Content-Length", "0");
        if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
            Log.w(RestUploader.class.getSimpleName(), ": response code: " + connection.getResponseMessage());
        } else {
            final BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));
            final String line = reader.readLine();
            reader.close();
            return Long.parseLong(line);
        }
    } catch (final MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (final ProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (final IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return -1;

我试过设置

connection.setDoOutput(true);

但它不起作用。服务器响应始终为405(方法不允许),服务器日志表明它是GET请求。

setDquestMethod的Android JavaDoc说:

  

此方法只能在建立连接之前调用。

这是否意味着必须在url.openConnection()之前调用该方法?我应该如何创建HttpURLConnection实例?我见过的所有例子都是如上所述。

我希望有人知道为什么它总是发送GET请求而不是POST。

提前致谢。

2 个答案:

答案 0 :(得分:0)

connection.setRequestMethod("POST");
connection.setDoOutput(false);

在上面的两个陈述中放置

connection.setDoOutput(true)

connection.setRequestMethod("POST")

语句

答案 1 :(得分:0)

我的.htaccess有一个重写规则,将www重定向到http://。原来我的Java代码工作得很好!重定向/重写规则使我的第一个请求(POST)转发到http,因此“成为”GET。我的PHP脚本只是在监听POST,而且直到我发现自己的错误有了重定向规则时,我才抓住了头脑。检查你的这种“问题”。

对我来说,首先设置setDoOutput或setRequestMethod并不重要,任何订单都有效(API 23)。目前,事情按此顺序排列:

HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setInstanceFollowRedirects(false);
con.setUseCaches(false);
con.setRequestMethod("POST");
con.setDoOutput(true);
con.setRequestProperty("Content-Type",bla bla
con.setRequestProperty("Accept-Charset", "UTF-8");
con.setRequestProperty("Content-Length", String.valueOf(PARAMETER_VARIABLE.getBytes().length));
con.setFixedLengthStreamingMode(PARAMETER_VARIABLE.getBytes().length);
OutputStream os = con.getOutputStream();
os.write(PARAMETER_VARIABLE.getBytes());
os.flush();
os.close();