2016-08-02 10 views
1

AndroidアプリをHttpURLConnectionを備えた快適なサーバーに接続しようとしています。 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要求はカウンタを変更するので、データは必要ありません。

同じ機能がwebfrontendためにjQueryを使ってJavaScriptで実装し、

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

EDITを動作します: は、多分それは、サーバーに問題があります。現在、私は私がhttp://httpbin.org/putと私のアプリを試してみました、それが働いた

<?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 { 
    } 
?> 

PHPファイルを使用しています。

+0

応答コードを取得する前に、PUTの場合は接続の出力ストリームを閉じてみます。 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"); 

を変更する必要がありますそして今、それは動作します。たぶん誰かが私にそれを説明することができます。 http://server.com/apicurlで開こうとすると、303 redirectからhttp://server.com/apiに変わります。

関連する問題