0

一部のデータを提供する 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")
4

4 に答える 4

1

デモコードには、oamdata5の後のURLにいくつかの空白が含まれています。あれは正しいですか?

于 2012-04-13T14:15:21.197 に答える
0

ユーザーエージェントを Firefox に設定するだけです。

headers = {"User-agent": "Mozilla/5.0"}
request = urllib2.Request(url, None, headers)
result = urllib2.urlopen(request)
html = result.read()
于 2012-04-13T13:12:50.323 に答える
0

Wireshark を使用して、urllib2 によって送信されている要求をキャプチャします。このようにして、何が間違っているのかを見つけることができるはずです。

于 2012-04-13T13:14:02.070 に答える
0

404 を生み出したのは何ですか? 404 ページの実際の内容は何ですか (よく問題の内容が説明されています)。それが目的の Web サイトであったことは確かですか? フィルタリング ファイアウォールは、内部認証プロキシを経由しない送信 HTTP 接続を拒否する場合があります。コードは、他の外部 Web サイトから HTTP コンテンツを正常にフェッチしますか?


サーバーは同じマシン上にあり、Tomcat ログにエラーが表示されるため、ファイアウォールの問題ではありません。私の次の提案は、ローカル HTTP プロキシを設定することです (たとえば、http://code.google.com/p/python-proxy/または真剣に単純な python HTTP プロキシを参照してください)。次に、それを使用するように Web ブラウザーの構成を変更します。プロキシで可能な限り多くのログをオンにします。ブラウザーからページを取得し、ログ データを保存してから、Python コードからデータを取得してみます (プロキシを使用するように更新しました)。プロキシによってログに記録されたデータを比較することで、重大な違いを把握できるはずです。

于 2012-04-13T13:14:04.080 に答える