2009-07-27 10 views
7

私はPHPとPythonでWebサービスをテストしていました。 Webサービスのアドレスは、http://my.domain.com/my/webserviceとしましょう。そのURLを使ってPHPでWebサービスをテストしたところ、すべて正常に動作しました。しかし、私は同じ場所を使用したが、SOAPpyを使ってPythonでエラーが発生しました。以下はなぜWebサービスの末尾にスラッシュが重要なのですか?

Iは、Webサービス(パイソン)との通信に使用するコードです:

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice', namespace) 
server.myFunction() 

私は、サーバーからもらった応答:

HTTPError: <HTTPError 301 Moved Permanently> 

私が追加した場合、私がいることを把握それは動作するWebサービスの場所に後続のスラッシュ!

from SOAPpy import WSDL 
server = SOAPProxy('http://my.domain.com/my/webservice/', namespace) 
server.myFunction() 

なぜ末尾にスラッシュがないとエラーが発生しますか?実際のサーバーのURLがあるので

答えて

19

別のURLです。 http://my.domain.com/my/webservicemyフォルダにあるファイルwebserviceを意味します。 http://my.domain.com/my/webservice/は、my/webserviceフォルダ内のデフォルトドキュメントを意味します。

多くのWebサーバーが自動的にこのようなURLを修正しますが、そうする必要はありません。

2

[免責事項]これは私の回答from hereのコピーです。私は何人かの人々が、コピーのこの種のが好きではない知っているが、スラッシュが重要である理由を説明。]

は、あなたがクリックオン

<a href="more.html">Read more...</a> 

を含むページ

http://mydomain.com/bla 

を果たす想像しますユーザーのブラウザはhttp://mydomain.com/more.htmlを検索します。あなたの代わりに(同じ内容の)

http://mydomain.com/bla/ 

を務めていた、ブラウザがhttp://mydomain.com/bla/more.htmlを取得します。このあいまいさを避けるために、URLがディレクトリを指している場合はリダイレクトによってスラッシュが追加されます。

3

エラーは301リダイレクトで、Webサーバーの最後にスラッシュが付いたURLにリダイレクトされています。

PHPは自動的にこのリダイレクトに従うので、Pythonはエラーをスローしません。あなたは、次の操作を実行する必要があります。

  1. はキャッチ
  2. 初期URLに接続するために、任意の301リダイレクトを試してみて、おそらく302
  3. 同様リダイレクト
  4. リダイレクトが、その後があった場合、代わりにそのURLに接続しよう。

新しいURLは、応答ヘッダーで使用できる必要があります。

HTH。

0

スラッシュが必要な場合は、サーバーとSOAPの実装によって異なります。

あなたのケースでは、ターゲットサーバーがApacheサーバーであり、SOAP URLが実際にSOAP処理スクリプトを含むディレクトリであると仮定します。 サーバー上でhttp://my.domain.com/my/webserviceにアクセスすると、apacheはディレクトリが適切にアドレス指定されていると判断してhttp://my.domain.com/my/webservice/と判断し、301リダイレクトを送信します。

SOAPはHTTP POSTを使用します。クライアントはリダイレクトを続行するかどうかを判断するために、HTTP POSTを想定していないと判断します。

その他のSOAPの実装。 JavaのApache Axisには、サーブレットのようなURLがあります。 http://domain.com/soap/webserviceスラッシュなしで、この場合スラッシュのないURLは正しいですが、とにかく存在するディレクトリはありません。

リダイレクトでもAxisが失敗すると思います。

関連する問題