Python HTTP错误415我做错了什么?

Python HTTP错误415我做错了什么?,python,http,soap,post,Python,Http,Soap,Post,我正在发送一个SOAP帖子,收到一个“HTTPError:HTTP Error 415:Unsupported Media Type”@response=urllib2.urlopen(req) data=”“” 1. """ 标题={ “内容类型”:“应用程序/soap+xml;字符集=utf-8” '主机:“webservices.autotask.net”' '内容类型:text/xml;字符集=utf-8' '内容长度:len(数据)' “SOAPAction:”http://autot

我正在发送一个SOAP帖子,收到一个“HTTPError:HTTP Error 415:Unsupported Media Type”@response=urllib2.urlopen(req)

data=”“”
1.
"""
标题={
“内容类型”:“应用程序/soap+xml;字符集=utf-8”
'主机:“webservices.autotask.net”'
'内容类型:text/xml;字符集=utf-8'
'内容长度:len(数据)'
“SOAPAction:”http://autotask.net/ATWS/v1_5/getThresholdAndUsageInfo"'
}
场地https://webservices.autotask.net/atservices/1.5/atws.asmx'
auth_handler=urllib2.HTTPBasicAuthHandler()
验证处理程序。添加密码(realm='webservices.autotask.net',
uri=站点,
用户:乔治。lastname@domain.com',
passwd='mypw')
opener=urlib2.build\u opener(auth\u处理程序)
urllib2.install_opener(opener)
page=urllib2.urlopen(site)#此处出现错误415
请求(站点、数据、标题)
响应=urllib2.urlopen(请求)

我做错了什么?谢谢

字典
标题中的
内容长度
值似乎有误

'Content-Length: len(data)' 
还有其他一些价值观

我会用以下方法解决它:

headers = {
    'Content-Type': 'application/soap+xml; charset=utf-8',
    'Host': 'webservices.autotask.net',
    'Content-Length': len(data),
    'SOAPAction': 'http://autotask.net/ATWS/v1_5/getThresholdAndUsageInfo'
}

在标题中,您有两次列出的内容类型


您发送的消息使用的是SOAP1.1命名空间,该命名空间将匹配第二种内容类型(text/xml)。根据这个错误,我猜第一个内容类型(application/soap+xml)是soap1.2消息,它实际上被发送到服务器。删除第一种内容类型,如果您的服务器确实需要SOAP 1.1消息,则应该修复该问题。

我知道这是修复的,但我花了相当长的时间处理相同的错误,并且没有可行的解决方案,我想将此解决方案发布出来,以防其他人遇到与我相同的问题。经过几个小时的搜索,我注意到我正在查看的文件使用的是SOAPV1.2。这可能是一个问题,因为据我所知,Suds还不支持v1.2

我在这里找到了一个变通方法,使Suds认为它正在使用v1.2:。我相信这不会对每个人都有效,因为这415错误可能是由许多不同的事情引起的,但它对我有效,对于这个问题几乎没有解决方案,所以我们在这里得到的越多越好。我已经在下面粘贴了适用于我的代码(该页面上有一些潜在的解决方案)


将其更改为:
'Content-Length:“%d”%len(data)
,但同样的情况也发生了。很好,您的标题起作用了,我现在得到了预期的响应。谢谢!!!为什么两次提到内容类型?当我删除内容类型时,我得到一个“AttributeError:'set'对象没有属性'items'”@req=urllib2.Request(站点、数据、标题)。服务器可以同时接受SOAP 1.1和SOAP 1.2。
headers = {
    'Content-Type': 'application/soap+xml; charset=utf-8',
    'Host': 'webservices.autotask.net',
    'Content-Length': len(data),
    'SOAPAction': 'http://autotask.net/ATWS/v1_5/getThresholdAndUsageInfo'
}
from suds.client import Client
from suds.bindings import binding
import logging

USERNAME = 'username'
PASSWORD = 'password'

# Just for debugging purposes.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)

# Telnic's SOAP server expects a SOAP 1.2 envelope, not a SOAP 1.1 envelope
# and will complain if this hack isn't done.
binding.envns = ('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')
client = Client('client.wsdl',
    username=USERNAME,
    password=PASSWORD,
    headers={'Content-Type': 'application/soap+xml'})

# This will now work just fine.
client.service.someRandomMethod()