Ошибка HTTP 415, что я делаю не так? - PullRequest
3 голосов
/ 07 марта 2011

Я отправляю SOAP POST и получаю сообщение «HTTPError: HTTP Error 415: Unsupported Media Type» @ response = urllib2.urlopen (req)

data = """<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Header>
    <AutotaskIntegrations xmlns="http://autotask.net/ATWS/v1_5/">
      <PartnerID>1</PartnerID>
    </AutotaskIntegrations>
  </soap:Header>
  <soap:Body>
    <getThresholdAndUsageInfo xmlns="http://autotask.net/ATWS/v1_5/">
    </getThresholdAndUsageInfo>
  </soap:Body>
</soap:Envelope>"""

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

site = 'https://webservices.autotask.net/atservices/1.5/atws.asmx'
auth_handler = urllib2.HTTPBasicAuthHandler()
auth_handler.add_password(realm='webservices.autotask.net',
                          uri=site,
                          user='george.lastname@domain.com',
                          passwd='mypw')
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
page = urllib2.urlopen(site)                            #errors out 415 here
req = urllib2.Request(site, data, headers)
response = urllib2.urlopen(req)

Что я делаю не так? Спасибо!

Ответы [ 3 ]

5 голосов
/ 07 марта 2011

Значение Content-Length в словаре headers кажется неправильным

'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'
}
4 голосов
/ 22 декабря 2011

Я знаю, что это исправлено, но я потратил довольно много времени с той же ошибкой и без работоспособного решения, и хотел получить это решение на случай, если у кого-то еще возникла та же проблема, что и у меня. После нескольких часов поиска я заметил, что файл, на который я смотрел, использовал SOAP v1.2. Это потенциально проблема, потому что Suds (насколько мне известно) еще не поддерживает v1.2.

Я нашел обходной путь, заставляющий Suds думать, что он использует v1.2 здесь: SOAP 1.2 клиент Python . Я уверен, что это не сработает для всех, так как эта ошибка 415 может быть вызвана множеством разных причин, но она сработала для меня, и есть очень мало решений этой проблемы, поэтому, чем больше мы сможем попасть сюда, тем лучше. Я вставил код, который работал для меня ниже (на этой странице было несколько потенциальных решений).

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()
1 голос
/ 07 марта 2011

В заголовках у вас дважды указан тип контента.

Отправляемое сообщение использует пространство имен SOAP 1.1, которое соответствует второму типу содержимого (text / xml).Основываясь на ошибке, я бы предположил, что первый Content-Type (application / soap + xml), который предназначен для SOAP 1.2, на самом деле отправляется на сервер.Удалите первый Content-Type, который должен исправить, если ваш сервер действительно ожидает сообщения SOAP 1.1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...