2016-08-02 82 views
1

我想通過HttpURLConnection將Android應用程序連接到一個寧靜的服務器。 GET請求成功,但PUT請求不成功。每個PUT請求都以GET請求的形式到達服務器。Android HttpURLConnection setRequestMethod PUT

@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的webfrontend和工作

$.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和它的工作。

+0

嘗試在收到響應代碼之前關閉連接的輸出流。 NB'connect()'是不必要的。 – EJP

+0

更改我的代碼。沒有幫助 –

+0

非常好奇。你可以嘗試發送一些東西,說一個空間? – EJP

回答

0

我發現了這個問題。我必須附加一個尾部斜線到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

相關問題