2009-06-30 2 views
0

Я пытаюсь отправить SOAP-запрос, используя SOAPpy в качестве клиента. Я нашел документацию о том, как добавить файл cookie, расширив SOAPpy.HTTPTransport, но я не могу заставить его работать.Добавление Cookie в запрос SOAPpy

Я пытался использовать пример here, но сервер я пытаюсь отправить запрос начали забрасывать 415 ошибок, так что я пытаюсь сделать это без использования ClientCookie, или выяснить, почему сервер бросая 415, когда я его использую. Я подозреваю, что это может быть потому, что ClientCookie использует urllib2 & HTTP/1.1, в то время как SOAPpy использует URLLIB & HTTP/1.0

ли кто-нибудь знает, как сделать использование ClientCookie HTTP/1.0, если это даже проблема, или способ добавить cookie для заголовков SOAPpy без использования ClientCookie? Если вы пробовали этот код с помощью других сервисов, он просто бросает ошибки при отправке запросов на серверы Microsoft.

Я все еще нахожусь на ногах с питоном, так что это может быть просто что-то неловкое.

import sys, os, string 
from SOAPpy import WSDL,HTTPTransport,Config,SOAPAddress,Types 
import ClientCookie 

Config.cookieJar = ClientCookie.MozillaCookieJar() 

class CookieTransport(HTTPTransport): 
    def call(self, addr, data, namespace, soapaction = None, encoding = None, 
    http_proxy = None, config = Config): 

    if not isinstance(addr, SOAPAddress): 
     addr = SOAPAddress(addr, config) 

    cookie_cutter = ClientCookie.HTTPCookieProcessor(config.cookieJar) 
    hh = ClientCookie.HTTPHandler() 
    hh.set_http_debuglevel(1) 

    # TODO proxy support 
    opener = ClientCookie.build_opener(cookie_cutter, hh) 

    t = 'text/xml'; 
    if encoding != None: 
     t += '; charset="%s"' % encoding 
    opener.addheaders = [("Content-Type", t), 
      ("Cookie", "Username=foobar"), # ClientCookie should handle 
      ("SOAPAction" , "%s" % (soapaction))] 

    response = opener.open(addr.proto + "://" + addr.host + addr.path, data) 
    data = response.read() 

    # get the new namespace 
    if namespace is None: 
     new_ns = None 
    else: 
     new_ns = self.getNS(namespace, data) 

    print '\n' * 4 , '-'*50 
    # return response payload 
    return data, new_ns 


url = 'http://www.authorstream.com/Services/Test.asmx?WSDL' 
proxy = WSDL.Proxy(url, transport=CookieTransport) 
print proxy.GetList() 
+0

I возможно, понял это, попробовав что-то – supersighs

ответ

0

Ошибка 415 связана с неправильным заголовком содержимого.

Установите httpfox для firefox или любого другого инструмента (wirehark, Charles или Fiddler), чтобы отслеживать, какие заголовки вы отправляете. Попробуйте Content-Type: application/xml.

... 
t = 'application/xml'; 
if encoding != None: 
    t += '; charset="%s"' % encoding 
... 

Если вы пытаетесь отправить файл на использование веб-сервера Content-Type: применение/х-WWW-форм-urlencoded

+0

. С тех пор я обнаружил, что это именно та проблема, у меня проблемы с ее переопределением. Я пытаюсь установить его в коде выше, но он не принимает. – supersighs