2012-01-19 7 views
7

私はLinux Slackware 13.0でSUDS 0.4をPython 2.6.2で実行しています。私はこのコードを使用してSOAPメソッドを呼び出すとき:SUDSを使用している空のcookiejar

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で送信された認証情報を渡す必要があるため、SOAP APIを使用できません。

私にこれを手伝ってください。

BR

rjan

答えて

6

[OK]を、私はそれで少し周りをプレイしました。

少しテストサーバー(courtesy of soaplib)、第一:Cookieヘッダを設定するためにいくつかの小さな変更を加え

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" 

と泡-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/>]> 

はそれが動作するように縫い目。しかし、あなたはhttp://localhost:7789/?wsdlに要求URLを変更した場合、あなたが買ってあげる:

クライアントで cookielibのためにいくつかのログをオンに
(stringArray){ 
    string[] = 
     "Hello, spam", 
} 
<cookielib.CookieJar[]> 

...

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[]> 

簡単な説明は次のとおりです。クッキードメインはリクエストのサーバードメインと一致しません。cookielibは確認時にルックアップを行いませんドメイン。

ので、溶液は1次のようになります。(ドメイン名またはIPのいずれか)、クライアントとサーバーが同じドメインを使用してください


  • の例では、私はそれを動作させるためにlocalhost.localの両方を設定する必要があります(5月ファイルhostsに依存しています...)
  • その後、cookieib
  • 自動的にリクエストのドメインを使用していますああ

DNSルックアップを使用してのCookieJar、及び少なくとも最後のではなく、実装、送られたクッキーからドメインを削除する:それはしなかった理由をOPの質問の作業:
ポートがドメインの一部でないため、Domain=10.242.69.4:8088のクッキーは常に拒否されます。

関連する問題