Использование urllib2 для выполнения SOAP POST, но я получаю сообщение об ошибке - PullRequest
4 голосов
/ 06 марта 2011

Я пытаюсь выполнить вызов API через SOAP POST и получаю сообщение «TypeError: недопустимая не строковая последовательность или объект отображения».@ data = urllib.urlencode (values)

SM_TEMPLATE = """<?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>partner id</PartnerID>
    </AutotaskIntegrations>
  </soap:Header>
  <soap:Body>
    <getThresholdAndUsageInfo xmlns="http://Autotask.net/ATWS/v1_5/">
    </getThresholdAndUsageInfo>
  </soap:Body>
</soap:Envelope>"""

values = SM_TEMPLATE%()
data = urllib.urlencode(values)
req = urllib2.Request(site, data)
response = urllib2.urlopen(req)
the_page = response.read()

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

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

Функция urllib.urlencode ожидает последовательность пар ключ-значение или тип отображения, например dict:

>>> urllib.urlencode([('a','1'), ('b','2'), ('b', '3')])
'a=1&b=2&b=3'

Чтобы выполнить HTTP-запрос POST SOAP, необходимо оставить BLOB-объект SM_TEMPLATE как естьи установите его в качестве тела POST, затем добавьте заголовок Content-Type для кодировки и набора символов тела POST.Например:

data = SM_TEMPLATE
headers = {
    'Content-Type': 'application/soap+xml; charset=utf-8'
    }
req = urllib2.Request(site, data, headers)
0 голосов
/ 10 мая 2016

Посмотрите код ниже в качестве примера, он может помочь вам решить ваш SOAP-запрос, используя urllib2 для Python 2.6.6.У меня сработало обращение к Oracle Data Integrator (Oracle ODI). Очевидно, вы ДОЛЖНЫ адаптировать значения к тем из них, которые подходят для вашего случая:

import urllib2

url = "http://alexmoleiro.com:20910/oraclediagent/OdiInvoke?wsdl"

post_data = """<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/">
    <Body>
        what_you_want_to_send_in_a_correct_format
    </Body>
</Envelope>
"""

http_headers = {
    "Accept": "application/soap+xml,multipart/related,text/*",
    "Cache-Control": "no-cache",
    "Pragma": "no-cache",
    "Content-Type": "text/xml; charset=utf-8"

}

request_object = urllib2.Request(url, post_data, http_headers)

#DELETE THIS BLOCK IF YOU ARE NOT USING PROXIES
http_proxy_server = "10.1.2.3"
http_proxy_port = "8080"
http_proxy_realm = http_proxy_server
http_proxy_full_auth_string = "http://%s:%s" % (http_proxy_server, http_proxy_port)
proxy = urllib2.ProxyHandler({'http': http_proxy_full_auth_string})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
#END OF --> DELETE THIS BLOCK IF YOU ARE NOT USING PROXIES

response = urllib2.urlopen(request_object)
html_string = response.read()
print html_string

Любая обратная связь будет оценена: -)

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