Почему я получаю "Исключение: (404, ты не найден") с югом - PullRequest
4 голосов
/ 28 июня 2011

Я пытаюсь подключиться к мыльным службам SugarCRM (какова правильная терминология?), Используя Suds:

from suds.client import Client

url = "http://localhost/sugarcrm/soap.php?wsdl"
client = Client(url)
session = client.service.login("usr", "pwd")

Но самая последняя строка выдает исключение:

ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns3="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns0="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://www.sugarcrm.com/sugarcrm" xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
   <SOAP-ENV:Header/>
   <ns2:Body>
      <ns1:login>
         <user_auth xsi:type="ns1:user_auth">usr</user_auth>
         <application_name xsi:type="ns3:string">pwd</application_name>
      </ns1:login>
   </ns2:Body>
</SOAP-ENV:Envelope>
Traceback (most recent call last):
  File "python.py", line 5, in <module>
    session = client.service.login("usr", "pwd")
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 542, in __call__
    return client.invoke(args, kwargs)
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 602, in invoke
    result = self.send(soapenv)
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 653, in send
    result = self.failed(binding, e)
  File "/usr/lib/pymodules/python2.6/suds/client.py", line 714, in failed
    raise Exception((status, reason))
Exception: (404, u'Not Found')

Ответы [ 3 ]

4 голосов
/ 28 июня 2011

Попробуйте также передать аргумент location=url в конструктор Client. Иногда элемент location в WSDL не совпадает с URI на сервере.

client = Client(url, location=url)
1 голос
/ 06 августа 2013

У меня возникла та же проблема при использовании заглушки соединения SUDS.Я всегда получал Exception: (404, u'Not Found') Все остальное было настроено нормально, поэтому я просто начал угадывать и пытаться.

Я не знаю, вызвали ли некоторые SOAP-серверы это или тот факт, что мне нужно установить местоположение вручную.Решение состояло в том, чтобы добавить название службы к URL-адресу местоположения.Таким образом, вам нужно создать несколько заглушек для каждого отдельного используемого сервиса, но он работает:

servicename = "TestService"    

client = Client(                                                                                                                                                      
    url="foobar.wsdl",                                                                                                                                              
    location = "http://soap.example.com/foobar/" + servicename ,
)

result = client[servicename]["TestServicePort"].TestServiceFunction()
print(result)

Это не предполагаемое поведение, потому что SUDS должен это делать сам (я думаю), но это был единственный вариантчтобы пройти эту ошибку.Возможно, это вызвано тем, что мне нужно было указать атрибут Client.location вручную, и поэтому SUDS больше не меняет его независимо от того, какую службу мне нужно вызывать.

Поскольку мне потребовалось некоторое время, чтобы выяснить,Бьюсь об заклад, это помогает бедняге: D

С уважением, Майкл

1 голос
/ 28 июня 2011

Если вы не подключены к использованию Suds, попробуйте библиотеку Python, над которой мы работали, для подключения к SugarCRM через Python. Он сравнивает REST и SOAP, что должно значительно ускорить доступ.

Проверьте это на https://github.com/sugarcrm/python_webservices_library

...