Python SUDS SOAP запрос к службе https 401 - PullRequest
6 голосов
/ 02 января 2012

Я пытаюсь использовать SUDS и застреваю, пытаясь выяснить, почему я не могу заставить аутентификацию работать (или https).

Служба, к которой я пытаюсь получить доступ, работает по протоколу https с базовой дайджест-проверкой подлинности. Судя по отладкам, он использует http вместо https. Но не совсем уверен, что мне не хватает. Любая подсказка приветствуется.

from suds.client import Client
from suds.transport.http import HttpAuthenticated
import logging
logging.basicConfig(level=logging.DEBUG)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)

def main():
    url = 'https://blah.com/soap/sp/Services?wsdl'
    credentials = dict(username='xxxx', password='xxxx')
    t = HttpAuthenticated(**credentials)
    client = Client(url, location='https://blah.com/soap/sp/Services', transport=t)
    print client.last_sent()

if __name__=="__main__":
    main()

Вывод отладки:

DEBUG: suds.wsdl: чтение wsdl по адресу: https://blah.com/soap/sp/Services?wsdl ... ОТЛАДКА: suds.transport.http: открытие (https://blah.com/soap/sp/Services?wsdl)
Снип ...
Файл "C: \ Python27 \ Lib \ site-packages \ suds-0.4-py2.7 \ suds \ reader.py", строка 95, в загрузке
fp = self.options.transport.open (Запрос (url))

Файл "C: \ Python27 \ Lib \ site-packages \ suds-0.4-py2.7 \ suds \ transport \ http.py", строка 173, в открытом виде
return HttpTransport.open (самостоятельно, запрос)

Файл "C: \ Python27 \ Lib \ site-packages \ suds-0.4-py2.7 \ suds \ transport \ http.py", строка 64, в открытом виде
поднять TransportError (str (e), e.code, e.fp)

suds.transport.TransportError: Ошибка HTTP 401: требуется авторизация

Ответы [ 2 ]

7 голосов
/ 07 января 2012

Suds предоставляет два класса HttpAuthenticated, один в модуле suds.transport.http и второй в модуле suds.transport.https. Похоже, ваш экземпляр от suds.transport.http, однако, так как ваш URL-адрес https://, вы можете попробовать suds.transport.https.HttpAuthenticated.

5 голосов
/ 19 мая 2014

Я наткнулся на эту проблему и нашел решение, которое работает для меня. Мой сервер использовал проверку подлинности NTLM, поэтому для работы с suds мне просто нужно было следовать разделу «Windows (NTLM)» в документации .

Сначала установите python-ntlm , а затем вы можете написать:

from suds.transport.https import WindowsHttpAuthenticated
ntlm = WindowsHttpAuthenticated(username='xx', password='xx')
client = Client(url, transport=ntlm)
...