7

salesforce-python-toolkitを使用してSalesforceAPIへのWebサービス呼び出しを行おうとしていますが、クライアントにプロキシを経由させるのに問題があります。ツールキットはsudの上に基づいているので、sud自体だけを使用して、そこでプロキシ設定を尊重できるかどうかを確認しようとしましたが、どちらも機能しませんでした。

これは、OS X 10.7(python 2.7)とubuntu12.04の両方のsuds0.3.9でテストされています。

私が行ったリクエストの例では、プロキシを通過しませんでした(ローカルで実行されているげっぷまたはcharlesプロキシのみ):

import suds
ws = suds.client.Client('file://sandbox.xml',proxy={'http':'http://localhost:8888'})
ws.service.login('user','pass')

私はプロキシでさまざまなことを試しました-http://を削除し、IPを使用し、FQDNを使用します。pdbのコードをステップ実行し、プロキシオプションが設定されていることを確認しました。また、プロキシなしでクライアントをインスタンス化してから、次のように設定してみました:ws.set_options(proxy = {'http':'http:// localhost:8888'})

プロキシはsudsによって使用されなくなりましたか?ここhttp://jortel.fedorapeople.org/suds/doc/suds.options.Options-class.htmlに直接リストされていませんが、輸送中は表示されています。トランスポートを介して別の方法で設定する必要がありますか?pdbにステップスルーしたとき、トランスポートを使用しているように見えましたが、方法がわかりません。

ありがとうございました!

4

5 に答える 5

14

私はfreenodeの#sudsに入り、Xelnor / rbarroisが素晴らしい答えを提供しました!どうやら、sudsのカスタムマッピングは、システム構成環境変数を使用するためのurllib2の動作をオーバーライドします。このソリューションは、http_proxy / https_proxy/no_proxy環境変数を適切に設定することに依存しています。

これが、プロキシやsud(またはsudを使用する他のライブラリ)で問題が発生する他の人に役立つことを願っています。https://gist.github.com/3721801

from suds.transport.http import HttpTransport as SudsHttpTransport 


class WellBehavedHttpTransport(SudsHttpTransport): 
    """HttpTransport which properly obeys the ``*_proxy`` environment variables.""" 

    def u2handlers(self): 
        """Return a list of specific handlers to add. 

        The urllib2 logic regarding ``build_opener(*handlers)`` is: 

        - It has a list of default handlers to use 

        - If a subclass or an instance of one of those default handlers is given 
            in ``*handlers``, it overrides the default one. 

        Suds uses a custom {'protocol': 'proxy'} mapping in self.proxy, and adds 
        a ProxyHandler(self.proxy) to that list of handlers. 
        This overrides the default behaviour of urllib2, which would otherwise 
        use the system configuration (environment variables on Linux, System 
        Configuration on Mac OS, ...) to determine which proxies to use for 
        the current protocol, and when not to use a proxy (no_proxy). 

        Thus, passing an empty list will use the default ProxyHandler which 
        behaves correctly. 
        """ 
        return []

client = suds.client.Client(my_wsdl, transport=WellBehavedHttpTransport())
于 2012-09-15T00:40:46.103 に答える
4

以下のようなurllib2オープナーを使ってできると思います。

import suds
t = suds.transport.http.HttpTransport()
proxy = urllib2.ProxyHandler({'http': 'http://localhost:8888'})
opener = urllib2.build_opener(proxy)
t.urlopener = opener
ws = suds.client.Client('file://sandbox.xml', transport=t)
于 2012-09-13T21:05:24.617 に答える
4

私は実際に2つのことをすることでそれを機能させることができました:

  • のプロキシ辞書にキーが含まれていることを確認しhttpますhttps
  • set_optionsクライアントの作成後にプロキシを設定します。

したがって、私の関連するコードは次のようになります。

self.suds_client = suds.client.Client(wsdl) self.suds_client.set_options(proxy={'http': 'http://localhost:8888', 'https': 'http://localhost:8888'})

于 2016-02-08T19:38:01.887 に答える
2

プロキシが適切に構成されていても、Sudsの使用で複数の問題が発生し、エンドポイントwsdlに接続できませんでした。回避策の策定にかなりの時間を費やした後、soap2pyを試してみることにしました-https : //code.google.com/p/pysimplesoap/wiki/SoapClient

バットからまっすぐに働いた。

于 2015-02-23T03:28:23.293 に答える
0

HTTPSを介してcjiのソリューションを試みている人は、実際には基本認証用のハンドラーの1つを保持する必要があります。私もpython3.7を使用しurllib2ているので、に置き換えられましたurllib.request

from suds.transport.https import HttpAuthenticated as SudsHttpsTransport
from urllib.request import HTTPBasicAuthHandler

class WellBehavedHttpsTransport(SudsHttpsTransport):
    """ HttpsTransport which properly obeys the ``*_proxy`` environment variables."""

    def u2handlers(self):
        """ Return a list of specific handlers to add.

        The urllib2 logic regarding ``build_opener(*handlers)`` is:

        - It has a list of default handlers to use

        - If a subclass or an instance of one of those default handlers is given
            in ``*handlers``, it overrides the default one.

        Suds uses a custom {'protocol': 'proxy'} mapping in self.proxy, and adds
        a ProxyHandler(self.proxy) to that list of handlers.
        This overrides the default behaviour of urllib2, which would otherwise
        use the system configuration (environment variables on Linux, System
        Configuration on Mac OS, ...) to determine which proxies to use for
        the current protocol, and when not to use a proxy (no_proxy).

        Thus, passing an empty list (asides from the BasicAuthHandler) 
        will use the default ProxyHandler which behaves correctly.
        """
        return [HTTPBasicAuthHandler(self.pm)]
于 2020-11-23T18:27:34.867 に答える