2009-06-30 60 views
0

我試圖使用SOAPpy作爲客戶端發送SOAP請求。我發現了一些文檔,說明如何通過擴展SOAPpy.HTTPTransport來添加一個cookie,但我似乎無法讓它工作。將Cookie添加到SOAPpy請求

我試圖用的例子here, 但我試圖發送到開始嘔吐415個錯誤的請求的服務器,所以我想,或者弄清楚爲什麼服務器要做到這一點,而無需使用ClientCookie當我使用它時扔415。我懷疑這可能是因爲ClientCookie使用的urllib2 & HTTP/1.1,而SOAPpy的使用urllib的& HTTP/1.0

是否有人知道如何使ClientCookie使用HTTP/1.0,如果是連的問題,還是一個方式來增加沒有使用ClientCookie的SOAPpy頭的cookie?如果使用其他服務試用此代碼,它只會在向Microsoft服務器發送請求時拋出錯誤。

我仍然在用python找到自己的立足點,所以它可能只是我在做一些愚蠢的事情。

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

我可能已經知道了這一點,嘗試一些 – supersighs 2009-06-30 04:19:42

回答

0

錯誤415是由於內容類型標頭不正確。

爲firefox或任何工具(wireshark,Charles或Fiddler)安裝httpfox來跟蹤您發送的標頭。嘗試Content-Type:application/xml。

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

如果你想將文件發送到Web服務器使用內容類型:應用程序/ x-WWW窗體-urlencoded

+0

我發現,這就是問題,即時通訊有困難重寫它。我試圖在上面的代碼中設置它,但它沒有考慮到。 – supersighs 2009-06-30 05:05:07