Java urllib2从启动的web服务返回HTTP 404
我有一个Spring3Web服务提供一些数据。它在Firefox上运行得非常好,但当我试图使用urllib2通过一个简单的Python脚本访问它时,我总是返回HTTP404 无论我是在Eclipse下通过Tomcat运行web服务,还是作为Windows服务运行Tomcat,都会发生这种情况 我能想到的唯一一件事(这似乎仍然不太可能)是web服务(幕后)对urllib2用户代理字符串不满意 有人能告诉我下一步该做什么吗 谢谢 米奇 下面是代码的简化版本,然后是屏幕输出:Java urllib2从启动的web服务返回HTTP 404,java,python,web-services,Java,Python,Web Services,我有一个Spring3Web服务提供一些数据。它在Firefox上运行得非常好,但当我试图使用urllib2通过一个简单的Python脚本访问它时,我总是返回HTTP404 无论我是在Eclipse下通过Tomcat运行web服务,还是作为Windows服务运行Tomcat,都会发生这种情况 我能想到的唯一一件事(这似乎仍然不太可能)是web服务(幕后)对urllib2用户代理字符串不满意 有人能告诉我下一步该做什么吗 谢谢 米奇 下面是代码的简化版本,然后是屏幕输出: import sys i
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/133413199000 HTTP/1.1\r\n接受编码:标识\r\n主机:tbdivb2400
2.corp.local:8086\r\n内容类型:text/xml\r\n连接:close\r\n用户代理:Python urllib/2.7\r\n\r\n'
答复:“找不到HTTP/1.1 404\r\n”
标题:服务器:apachecoyote/1.1
标题:内容类型:text/html;字符集=utf-8
标题:内容长度:952
标题:日期:2012年4月13日星期五13:56:28 GMT
标题:连接:关闭
错误:捕获到HTTPError异常
HTTP错误代码:404
ApacheTomcat/6.0.35-错误报告HTTP状态404-类型状态报告
消息描述请求的资源()不可用。Apache Tomcat/6.0
.35
我想问题出在我的Spring控制器配置上,但我还是不明白
为什么它总是单向工作,而不是从Python开始。我现在正在从Chrome运行,我相信我正在发送相同的东西
当我通过urllib发送请求时,我的Tomcat日志显示以下内容:
2012-04-13 14:31:26782 WARN 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>
只需将用户代理设置为Firefox
headers = {"User-agent": "Mozilla/5.0"}
request = urllib2.Request(url, None, headers)
result = urllib2.urlopen(request)
html = result.read()
使用Wireshark捕获urllib2发送的请求。我想通过这种方式,您应该能够发现问题所在。是什么产生了404?404页面的实际内容是什么(他们经常解释问题是什么)?你确定这是目的地网站吗?有时过滤防火墙会拒绝不通过内部身份验证代理的传出HTTP连接。代码是否成功地从其他外部网站获取HTTP内容
好的,因为服务器在同一台机器上,我们在Tomcat日志中得到一个错误,所以这不是防火墙问题。我的下一个建议是设置一个本地HTTP代理(参见示例或)。然后更改web浏览器配置以使用它。在代理中启用尽可能多的日志记录。从浏览器中获取页面,保存日志数据,然后尝试从python代码中获取数据(已将其更新为使用代理)。您应该能够通过比较代理记录的数据来找出关键差异。您的演示代码在oamdata5之后的URL中包含一些空格。正确吗?只需将用户代理设置为Firefox;-)。你能
wget
这个URL吗?很多服务器对Python用户代理不满意是有原因的。如果是这种情况,我的代码示例应该会有所帮助。您是否尝试过在服务器上运行一些“hello world”类型的应用程序,并通过Python获取HTML?我正在从Windows cmd.exe终端运行此应用程序,以Tomcat作为Windows服务在我自己的机器上运行。我已经验证了URL和Tomcat端口是否正确(它们在Firefox中工作)…James,是的,相同的代码可以从weather.yahoo.com(例如)获得数据。我不知道这是怎么得到的,真正的代码没有这个。。。我可以直接从Firefox复制URL,在那里没有问题。还是一样的问题。。。我整天都在看这个!我确实调出了Tomcat的日志,我看到了可能的大线索:
headers = {"User-agent": "Mozilla/5.0"}
request = urllib2.Request(url, None, headers)
result = urllib2.urlopen(request)
html = result.read()