2

JRuby 1.7.4、Sinatra 1.4.4、および Rack 1.5.2 を使用して単純な Web サービスを作成しました。この Web サービスは、GET、POST、PATCH、および DELETE 要求に対して、単純なメッセージ「Hello world using [request-type]」で応答します。

Rack を起動し、すべてのリクエスト タイプをテストしました。4つすべてが機能しました。

Warbler を使用してアプリケーションの war ファイルを作成し、Tomcat 7.0.47 にデプロイしました。Tomcat PATCH でテストしたところ、「HTTP ステータス 501 - Method PATCH は、この URI のこのサーブレットによって実装されていません」で失敗しました。(はい、「そうではありません」が繰り返されます。しかし、これは私が Tomcat から得た応答です。) GET、POST、および DELETE は正常に機能しました。

次に、Jetty 9.1.0 を使用してみました。同じ結果です。GET、POST、および DELETE は機能しますが、PATCH は失敗します。

PATCH リクエストが失敗するのはなぜですか? また、この設定でそれらを機能させるにはどうすればよいですか?

4

1 に答える 1

1

Tomcatのドキュメントによると、HttpServletはGET、POST、PUT、DELETEリクエストのみを処理できます

public 抽象クラス HttpServlet は GenericServlet を拡張します

Web サイトに適した HTTP サーブレットを作成するためにサブクラス化される抽象クラスを提供します。HttpServlet のサブクラスは、少なくとも 1 つのメソッド (通常は次のいずれか) をオーバーライドする必要があります。

doGet (サーブレットが HTTP GET 要求をサポートする場合) doPost (HTTP POST 要求の場合) doPut (HTTP PUT 要求の場合) doDelete (HTTP DELETE 要求の場合)

しかし、これは便利です:

任意の HTTP メソッド名のオーバーライドまたは設定を許可しない HTTP ライブラリを使用する場合は、POST 要求を送信し、クエリ文字列パラメーター _HttpMethod を介して HTTP メソッドにオーバーライドを提供できます。

たとえば、アカウントを更新するには、これは実際の POST リクエストで機能します。

.../services/data/v23.0/sobjects/Account/0016000000eEhmxAAC?_HttpMethod=PATCH
于 2013-12-11T08:02:12.017 に答える