2

Python から Tomcat のサーブレットに PUT リクエストを取得しようとしています。Tomcat に入ると、パラメータがありません。

同じコードは、POST リクエストでは問題なく機能しますが、PUT では機能しません。

クライアントは次のとおりです。

lConnection = httplib.HTTPConnection('localhost:8080')
lHeaders = {"Content-type": "application/x-www-form-urlencoded",
              "Accept": "text/plain"}
lParams = {'Username':'usr', 'Password':'password', 'Forenames':'First','Surname':'Last'}
lConnection.request("PUT", "/my/url/", urllib.urlencode(lParams), lHeaders)

サーバーに入ると、request.getParameter("Username") が null を返します。

パラメータを失っている場所について何か手がかりを持っている人はいますか?

4

3 に答える 3

2

私はあなたのコードを試しましたが、そのコードを使用してパラメーターがサーバーに到達するようです。Tcpdump は次のようになります。

PUT /my/url/ HTTP/1.1
Host: localhost
Accept-Encoding: identity
Content-Length: 59
Content-type: application/x-www-form-urlencoded
Accept: text/plain

Username=usr&Password=password&Surname=Last&Forenames=First

したがって、リクエストは反対側に正しく到達します。Tomcat 構成またはパラメーターを読み取ろうとするコードを使用する必要があります。

于 2010-07-16T16:40:55.827 に答える
2

あなたのコードのTomcat側がどのように見えるか、またはTomcatがどのように処理してリクエストパラメータへのアクセスを提供するかはわかりませんが、Tomcatはリクエストの本文を「自動的に」解析して適切PUTなリクエストパラメータに変換していないと思います。

webappApp Engineの組み込みフレームワーク (Python) を使用して、まったく同じ問題に遭遇しました。PUTリクエストの本文を、 self.request.get('param') で取得できるリクエスト パラメータに解析しませんでしたapplication/x-www-form-urlencoded

ただし、これを確認するには、Tomcat 側で確認する必要があります。リクエストの本文にアクセスしPUTて、自分でパラメータを解析しなければならない場合があります。

application/x-www-form-urlencodedWeb フレームワークがリクエスト内のパラメーターをPUT(リクエストの場合と同様に)自動的に解析することを期待するかどうかについてPOSTは、議論の余地があります。

于 2010-07-16T18:28:02.463 に答える
1

私はここで推測していますが、問題は PUT がそのように使用されることを意図していないことだと思います. PUT の目的は、リクエストに含まれる単一のエンティティを、ヘッダーで指定されたリソースに格納することです。ユーザー名などについてのこのすべてのものは何ですか?

あなたのコンテンツ タイプは ですapplication/X-www-form-urlencoded。これは、フィールド コンテンツの集まりです。PUT が必要とするのは、エンコードされたファイルのようなものです。ご存知のように、どこかに保存できる単一のデータの束です。

于 2010-07-16T16:44:39.360 に答える