urllib2从已启动的Web服务返回HTTP 404

时间:2012-04-13 13:07:31

标签: java python web-services

我有一个提供一些数据的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 - 错误报告

HTTP状态404 -

类型状态报告

  

消息

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

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")

4 个答案:

答案 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代码中获取数据(更新它以使用代理)。您应该能够通过比较代理记录的数据来找出关键差异。