【问题标题】:Android HttpURLConnection setRequestMethod PUTAndroid HttpURLConnection setRequestMethod PUT
【发布时间】:2016-08-02 00:37:44
【问题描述】:

我正在尝试使用 HttpURLConnection 将 Android 应用程序连接到安静的服务器。 GET 请求成功,但 PUT 请求不成功。每个 PUT 请求都作为 GET 请求到达服务器。

@Override
protected Boolean doInBackground(Method... params) {
    Boolean result = false;
    try {
        URL url = new URL("http://server.com/api");
       HttpURLConnection connection = (HttpURLConnection) url.openConnection();

        switch (params[0]) {
            case PUT:
                connection.setDoOutput(true);
                connection.setRequestMethod("PUT");
                Log.d(TAG, "Method: " + connection.getRequestMethod()); // Correctly "Method: PUT"
                OutputStreamWriter out = new OutputStreamWriter(
                    connection.getOutputStream());
                out.write("Message");
                out.close();
                break;
            case GET:
                connection.setRequestMethod("GET");
                connection.connect();
                break;
            default:
                connection.setRequestMethod("GET");
                connection.connect();
                break;
        }

        if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
            InputStream in = connection.getInputStream();

            JsonReader reader = new JsonReader(new InputStreamReader(in, "UTF-8"));

            reader.beginObject();
            while (reader.hasNext()) {
                String name = reader.nextName();
                if (name.equals("state")) {
                    result = true;
                    if (reader.nextInt() == 1) {
                        state = true;
                        Log.d(TAG, "state: 1");
                    } else {
                        state = false;
                        Log.d(TAG, "state: -1");
                    }
                } else if (name.equals("method")) {
                    method = reader.nextString(); // Server respone is "Method: GET"
                }
            }
            reader.endObject();
            in.close();
        } else {
            Log.d(TAG, "Connection failed");
        }
        connection.disconnect();
    } catch (Exception e) {
        Log.e("Exception", e.toString());
        e.printStackTrace();
    }
    return result;
}

请求方法在connection.connect(); 之前正确设置为PUT。我错过了什么?我不想发送数据。 PUT 请求更改了一个计数器,因此不需要数据。

在 Javascript 中使用 JQuery 为 web 前端实现了相同的功能并且可以正常工作

$.ajax({
    url: '/api',
    method: 'PUT'
});

编辑: 可能是服务器的问题。目前我正在使用一个 php 文件

<?php
    echo(var_dump($_SERVER)); // ["REQUEST_METHOD"]=> string(3) "GET"
    function get ($db) {
        $state = $db->querySingle('SELECT state FROM states WHERE name="main"');
        echo('{"state": ' . $state . ', "method": "get"}');
    }
    function put ($db) {
        $state = $db->querySingle('SELECT state FROM states WHERE name="main"');
        $db->exec('UPDATE states SET state=' . ($state+1)%2 . ' WHERE name="main"');
        $state = $db->querySingle('SELECT state FROM states WHERE name="main"');
        echo('{"state": ' . $state . ', "method": "put"}');
}

    if ($db = new SQLite3('database.sqlite')) {
        switch($_SERVER['REQUEST_METHOD']){
            case 'GET':
                get($db);
                break;
            case 'PUT':
                put($db);
                break;
        }
        $db->close();
    } else {
    }
?>

我用http://httpbin.org/put 尝试了我的应用程序,它成功了。

【问题讨论】:

  • 在获得响应代码之前,尝试关闭连接的输出流以防 PUT。 NB connect() 是不必要的。
  • 更改了我的代码。没有帮助
  • 很好奇。你可以尝试发送一些东西,比如说一个空格吗?
  • 现在我正在发送消息。
  • 您反对尝试其他 HTTP 库吗?

标签: java android rest httpurlconnection put


【解决方案1】:

我发现了问题。我必须在 url 后面附加一个斜杠,否则请求会被重定向并转换为 GET 请求。我不完全理解这个问题,但我找到了适合我的解决方案。

我必须改变

URL url = new URL("http://server.com/api");

URL url = new URL("http://server.com/api/");

现在它可以工作了。也许有人可以向我解释。当我尝试用curl 打开http://server.com/api 时,我得到一个303 redirecthttp://server.com/api

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多