我有一个提供一些数据的Spring 3 Web服务。它完全适用于Firefox,但是当我尝试使用urllib2通过一个简单的Python脚本访问它时,我一直都回到HTTP 404。
无论我是通过Eclipse下的Tomcat还是作为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 发送:'GET / OamDataWebService / oamdatawebservice / oamdata5 / SYRC01TAMP20 / 1334127600000/1334131199000 HTTP / 1.1 \ r \ nAccept-Encoding:identity \ r \ nHost:tbdivb2400 2.corp.local:8086 \ r \ nContent-Type:text / xml \ r \ n \ nConnection:close \ r \ nUser-Agent:Python-urllib / 2.7 \ r \ n \ r \ n' 回复:'HTTP / 1.1 404 Not Found \ r \ n' header:服务器:Apache-Coyote / 1.1 header:Content-Type:text / html; charset = utf-8 标题:内容长度:952 标题:日期:星期五,2012年4月13日13:56:28 GMT 标题:连接:关闭 错误:捕获HTTPError异常 HTTP错误代码:404 Apache Tomcat / 6.0.35 - 错误报告
类型状态报告
消息
描述请求的资源()不可用。
Apache Tomcat / 6.0 0.35
我认为问题出在我的Spring Controller配置中,但我仍然不明白 为什么它以一种方式工作,而不是来自Python。我现在正在从Chrome运行,我相信我也在发送同样的东西。
当我通过urllib发送请求时,我的Tomcat日志显示以下内容:
2012-04-13 14:31:26,782 WARN org.springframework.web.servlet.PageNotFound.handleNoSuchRequestHandlingMethod:142 - 找不到与servlet请求匹配的处理程序方法:path'/ oamdata5 / SYRC01TAMP20 / 1334127600000/1334131199000',方法'GET',参数图[[empty]]
My 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")
答案 0 :(得分:1)
您的演示代码在oamdata5之后的URL中包含一些空格。这是对的吗?
答案 1 :(得分:0)
只需将用户代理设置为Firefox。
headers = {"User-agent": "Mozilla/5.0"}
request = urllib2.Request(url, None, headers)
result = urllib2.urlopen(request)
html = result.read()
答案 2 :(得分:0)
使用Wireshark捕获urllib2发送的请求。我想就是这样,你应该能够发现什么是错的。
答案 3 :(得分:0)
什么产生了404? 404页面的实际内容是什么(他们经常解释问题是什么)?你确定它是目的地网站吗?有时,过滤防火墙会拒绝不通过内部验证代理进行的传出HTTP连接。代码是否成功从其他外部网站获取HTTP内容?
好的,既然服务器在同一台机器上,我们在Tomcat日志中出错,那就不是防火墙问题。我的下一个建议是设置本地HTTP代理(例如,请参阅http://code.google.com/p/python-proxy/或seriously simple python HTTP proxy?)。然后更改您的Web浏览器配置以使用它。尽可能多地打开代理中的日志记录。从浏览器中获取页面,保存日志数据,然后尝试从python代码中获取数据(更新它以使用代理)。您应该能够通过比较代理记录的数据来找出关键差异。