我有一个提供一些数据的 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")