7

Python 2.6.2 を使用して Linux Slackware 13.0 で SUDS 0.4 を実行しています。このコードを使用して SOAP メソッドを呼び出すと、次のようになります。

from suds.client import Client

client = Client(url='file:acctWeb.wsdl',
                location='http://10.242.69.4:8088/pfmaccess')

res = client.service.login(login='user',password='passwd')

次の応答を受け取ります。

DEBUG:suds.transport.http:received:
CODE: 200
HEADERS: {'set-cookie': 'OSP_Ref=0000000573800052;Domain=10.242.69.4:8088;Path=/pfmaccess', 'content-length': '26541', 'content-type': 'text/xml; charset=utf-8', 'connection': 'close', 'server': 'Alcatel-Lucent OSP 2.4'}

しかし

>>> client.options.transport.cookiejar
<cookielib.CookieJar[]>

利用可能な Cookie がないことを示します。その理由は何でしょうか?応答 Cookie で送信された資格情報を渡す必要があるため、SOAP API を使用できません。

これについて私を助けてください。

ブラジル

ジャン

4

1 に答える 1

6

わかりました、私はそれで少し遊んだことがあります。

まず、小さなテストサーバー(soaplibの提供):

import soaplib
from soaplib.core.service import rpc, DefinitionBase, soap
from soaplib.core.model.primitive import String, Integer
from soaplib.core.server import wsgi
from soaplib.core.model.clazz import Array
import sys, pprint

class HelloWorldService(DefinitionBase):
    @soap(String,Integer,_returns=Array(String))
    def say_hello(self,name,times):
        results = []
        for i in range(0,times):
            results.append('Hello, %s'%name)
        return results

class WsgiApp(wsgi.Application):

    def on_wsgi_return(self, env, headers, return_str):
        headers['Set-Cookie'] = 'spam=eggs;domain=127.0.0.1;path=/'
        print >>sys.stderr, headers

if __name__=='__main__':
    try:
        from wsgiref.simple_server import make_server
        soap_application = soaplib.core.Application([HelloWorldService], 'tns')
        wsgi_application = WsgiApp(soap_application)
        server = make_server('localhost', 7789, wsgi_application)
        server.serve_forever()
    except ImportError:
        print "Error: example server code requires Python >= 2.5"

Cookieヘッダーを設定するために少し変更を加えました。

およびsuds-testclient:

from suds import client, transport

c = client.Client("http://127.0.0.1:7789/?wsdl")
print c.service.say_hello("spam", 1)
print c.options.transport.cookiejar

これを実行すると、次のようになります。

(stringArray){
   string[] = 
      "Hello, spam",
 }
<cookielib.CookieJar[<Cookie spam=eggs for .127.0.0.1/>]>

そのため、動作するように継ぎ目があります。ただし、リクエストURLを次のように変更すると、次のようにhttp://localhost:7789/?wsdlなります。

(stringArray){
   string[] = 
      "Hello, spam",
 }
<cookielib.CookieJar[]>

クライアントでいくつかのロギングをオンにcookielibします...

import logging
import cookielib
logging.basicConfig()
logging.getLogger('cookielib').setLevel(logging.DEBUG)
cookielib.debug = True

...そしてそれは理由を明らかにします:

DEBUG:cookielib:add_cookie_header
DEBUG:cookielib:extract_cookies: Date: Thu, 17 May 2012 15:56:01 GMT
Server: WSGIServer/0.1 Python/2.7.3
Set-Cookie: spam=eggs;domain=127.0.0.1;path=/
Content-Length: 822
Content-Type: text/xml

DEBUG:cookielib: - checking cookie spam=eggs
DEBUG:cookielib:   effective request-host localhost.local (even with added initial
                   dot) does not end with .127.0.0.1
(stringArray){
   string[] = 
      "Hello, spam",
 }
<cookielib.CookieJar[]>

簡単な説明は次のとおりです。Cookieドメインがリクエストのサーバードメインと一致せずcookielib、ドメインを確認するときにルックアップを行わないようです。

したがって、解決策は次のいずれかになります。

  • クライアントとサーバーが同じドメイン(ドメイン名またはIPのいずれか)
    を使用していることを確認してください。この例では、両方を設定してlocalhost.local機能させる必要があります(hostsファイルによって異なる場合があります...)
  • 送信されたCookieからドメインを削除してから、cookieibリクエストドメインを自動的に使用します
  • DNSルックアップを使用するcookiejarを実装する

最後になりましたが、OPの質問で機能しなかった理由:
ポートはドメインの一部ではないため、CookieDomain=10.242.69.4:8088は常に拒否されます。

于 2012-05-17T16:17:55.933 に答える