一部のデータを提供する Spring 3 Web サービスがあります。Firefox からは完全に動作しますが、urllib2 を使用して単純な Python スクリプト経由でアクセスしようとすると、一貫して HTTP 404 が返されます。
これは、Eclipse で Tomcat を介して Web サービスを実行しているかどうか、または Windows サービスとして実行されている Tomcat を実行しているかどうかに関係なく発生します。
私が考えることができる唯一のこと(まだありそうにない)は、Webサービス(ボンネットの下)に関する何かがurllib2ユーザーエージェント文字列に不満があるということです...
次に何を試すかについて、誰かアイデアを教えてもらえますか?
ありがとう、
ミッチ
以下はコードの単純化されたバージョンで、その後に画面出力が続きます。
import sys
import urllib2
import urllib
import datetime
import time
import httplib
from datetime import timedelta
url = 'http://localhost:8086/OamDataWebService/oamdatawebservice/oamdata5 /SYRC01TAMP20/1334127600000/1334131199000'
handler=urllib2.HTTPHandler(debuglevel=1)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
req = urllib2.Request(url=url)
req.add_header('Content-Type', 'text/xml')
try:
resp = urllib2.urlopen(req)
except urllib2.HTTPError, e:
print "ERROR: caught HTTPError exception"
print "HTTP error code:", e.code
print e.read()
sys.exit(1)
content = resp.read()
print content
$ python test.py send: 'GET /OamDataWebService/oamdatawebservice/oamdata5/SYRC01TAMP20/1334127600000/1334131199000 HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: tbdivb2400 2.corp.local:8086\r\nContent-タイプ: text/xml\r\n接続: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n' 返信: 'HTTP/1.1 404 Not Found\r\n' ヘッダー: サーバー: Apache-Coyote/1.1 ヘッダー: Content-Type: text/html;charset=utf-8 ヘッダー: Content-Length: 952 ヘッダー: 日付: 2012 年 4 月 13 日金曜日 13:56:28 GMT ヘッダー: 接続: 閉じる エラー: キャッチHTTPError 例外 HTTP エラー コード: 404 Apache Tomcat/6.0.35 - エラー レポート
HTTP ステータス 404 -
タイプステータス レポート
メッセージ
説明要求されたリソース () は利用できません。
アパッチ トムキャット/6.0 .35
問題はSpring Controllerの構成にあると思いますが、Pythonからではなく一方向で一貫して機能する理由はまだわかりません。私は現在 Chrome から実行していますが、同じものを送信していると思います。
urllib 経由でリクエストを送信すると、Tomcat ログに次のように表示されます。
2012-04-13 14:31:26,782 警告 org.springframework.web.servlet.PageNotFound.handleNoSuchRequestHandlingMethod:142 - サーブレット要求に一致するハンドラー メソッドが見つかりません: パス '/oamdata5/SYRC01TAMP20/1334127600000/1334131199000'、メソッド 'GET' 、パラメータ マップ[[空]]
私のSpring web.xmlサーブレットマッピングは次のとおりです。
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
そして、私の RequestMapping エントリは次のとおりです。
@RequestMapping(value = "/{interval}/{serviceId}/{startTime}/{endTime}",
method = RequestMethod.GET,
headers="Accept=application/xml, application/json")