0

我有一个提供一些数据的 Spring 3 Web 服务。它可以在 Firefox 中完美运行,但是当我尝试使用 urllib2 通过简单的 Python 脚本访问它时,我始终返回 HTTP 404。

无论我是在 Eclipse 下通过 Tomcat 运行 Web 服务,还是将 Tomcat 作为 Windows 服务运行,都会发生这种情况。

我唯一能想到的(这似乎仍然不太可能)是关于 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连接:关闭\r\n用户代理:Python-urllib/2.7\r\n\r\n' 回复:'HTTP/1.1 404 Not Found\r\n' 标头:服务器: Apache-Coyote/1.1 标头:内容类型:文本/html;charset=utf-8 标头:内容长度:952 标头:日期:2012 年 4 月 13 日星期五 13:56:28 格林威治标准时间标头:连接:关闭错误:捕获HTTPError 异常 HTTP 错误代码:404 Apache Tomcat/6.0.35 - 错误报告

HTTP 状态 404 -

类型状态报告

信息

描述请求的资源 () 不可用。

Apache Tomcat/6.0 .35

我认为问题出在我的 Spring Controller 配置中,但我仍然不明白为什么它以一种方式如此一致地工作,而不是来自 Python。我现在从 Chrome 运行,我相信我正在发送同样的东西。

当我通过 urllib 发送请求时,我的 Tomcat 日志显示以下内容:

2012-04-13 14:31:26,782 警告 org.springframework.web.servlet.PageNotFound.handleNoSuchRequestHandlingMethod:142 - 未找到 servlet 请求的匹配处理程序方法:路径 '/oamdata5/SYRC01TAMP20/1334127600000/1334131199000',方法 'GET' , 参数映射[[empty]]

我的 Spring web.xml servlet 映射是:

<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 页面的实际内容是什么(他们经常解释问题所在)?你确定它是目标网站吗?有时过滤防火墙会拒绝不通过内部身份验证代理的传出 HTTP 连接。代码是否成功地从其他外部网站获取 HTTP 内容?


好的,因为服务器在同一台机器上,我们在 Tomcat 日志中收到错误,这不是防火墙问题。我的下一个建议是设置一个本地 HTTP 代理(参见例如http://code.google.com/p/python-proxy/非常简单的 python HTTP 代理?)。然后更改您的网络浏览器配置以使用它。尽可能多地打开代理登录。从您的浏览器中获取页面,保存日志数据,然后尝试从您的 python 代码中获取数据(已更新它以使用代理)。您应该能够通过比较代理记录的数据找出关键差异。

于 2012-04-13T13:14:04.080 回答