2009-05-13 15 views
11

は、使用してPUTリクエストからパラメータを取得しようとするHttpServlet#doPutメソッド:サーブレットパラメータとdoPutメソッドは

curl -X PUT \ 
     --data "name=batman" \ 
     --header "Content-Type: text/plain" http://localhost:8080/sample.html 

はdoGetメソッドを使用して正常に動作し、カールGETリクエスト:リクエストを送信するためにカール使用し

public void doPut(HttpServletRequest request, HttpServletResponse response) { 
    String name = request.getParameter("name"); 
    // name is null 
} 

。何か不足していますか?

答えて

20

私は、サーブレットは、サーバー上に置かれているデータについて何を負いかねますので、名前/値のペアを解析しないことに気づきました。

以下の解決策は、PUT経由で渡されたデータを処理する適切な方法であると思われ、XML、名前/値などとして解析できます。 doGet()doPost()方法とは異なり

BufferedReader br = new BufferedReader(new InputStreamReader(req.getInputStream()); 

String data = br.readLine(); 
+0

なぜあなたはそれを意味しない方法で使用しようとしていますか?しかし、あなたはあなたが好きなもので周りを遊ぶことができます。 –

+4

私は同じ問題に遭遇しています。私はrestfullサービスを実装しようとしています.PUTはリソースを置き換えるものです。 Jettyは要求パラメータマップ内のすべてのデータを利用可能にしますが、Tomcatはそうではありません。 – Andrej

+0

Java Webサービス:Up and Runningによると、 "doPostとdoPutは、サーブレットコンテナのランタイムが使用可能なパラメータマップを生成しないため、 TomcatとJettyの両方でそうです) " – Jason

1

doPut()は何も意味していませんか?私が知る限り、要求パラメータやものがあるdoGet()またはdoPost()のようには動作しません。

PUTを使用してサーバーに何かを置くことができます。特に、PUT操作では、クライアントはサーバー上にファイルを置くことができ、FTPでファイルを送信する場合と同様です。 JGuruで見つけたこの例を見てください。コメントやさらなる研究に基づいて

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 404 Not Found 

->PUT /file.dat HTTP/1.1 
Content-Length: 6 
Content-Type: text/plain 

Hello! 

<-HTTP/1.1 200 OK 

->GET /file.dat HTTP/1.1 

<-HTTP/1.1 200 OK 
Content-Length: 6 
Content-Type: text/plain 

Hello! 
0

、我々はdoPut()doDelete()方法でgetParameter()メソッドを使用してリクエストパラメータを取得することができません。入力ストリームから手動で検索する必要があります。

次のメソッドは、リクエストパラメータを取得し、マップにそれらを返します。

public static Map<String, String> getParameterMap(HttpServletRequest request) { 

    BufferedReader br = null; 
    Map<String, String> dataMap = null; 

    try { 

     InputStreamReader reader = new InputStreamReader(
       request.getInputStream()); 
     br = new BufferedReader(reader); 

     String data = br.readLine(); 

     dataMap = Splitter.on('&') 
       .trimResults() 
       .withKeyValueSeparator(
         Splitter.on('=') 
         .limit(2) 
         .trimResults()) 
       .split(data); 

     return dataMap; 
    } catch (IOException ex) { 
     Logger.getLogger(Utils.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if (br != null) { 
      try { 
       br.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(Utils.class.getName()).log(Level.WARNING, null, ex); 
      } 
     } 
    } 

    return dataMap; 
} 

の例では、パラメータを解析するために、Googleのグアバライブラリを使用しています。 doGet()doPost()doPut()およびdoDelete()の方法を含む完全な例については、私のUsing jsGrid tutorialを読むことができます。

関連する問題