0

SOAPpy をクライアントとして使用して SOAP リクエストを送信しようとしています。SOAPpy.HTTPTransport を拡張して Cookie を追加する方法を説明しているドキュメントをいくつか見つけましたが、それを機能させることができないようです。

ここの例を使用しようとしましたが、リクエストを送信しようとしているサーバーが 415 エラーをスローし始めたので、ClientCookie を使用せずに、またはサーバーが 415 をスローする理由を突き止めて、これを達成しようとしています。これを使って。SOAPpy は urllib と http/1.0 を使用するのに対し、ClientCookie は urllib2 と http/1.1 を使用するためではないかと思います。

ClientCookie に http/1.0 を使用させる方法、それが問題である場合、または ClientCookie を使用せずに Cookie を SOAPpy ヘッダーに追加する方法を誰かが知っていますか? 他のサービスを使用してこのコードを試した場合、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()
4

2 に答える 2

0

エラー 415 は、不適切な content-type ヘッダーが原因です。

送信しているヘッダーを追跡するには、firefox 用の httpfox またはその他のツール (wireshark、Charles、Fiddler) をインストールします。Content-Type: application/xml を試してください。

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

ファイルを Web サーバーに送信する場合は、Content-Type:application/x-www-form-urlencoded を使用します。

于 2009-06-30T04:56:46.700 に答える