首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用肥皂的空炊具

使用肥皂的空炊具
EN

Stack Overflow用户
提问于 2012-01-19 14:19:42
回答 1查看 1.6K关注 0票数 7

我在13.0和python 2.6.2上运行SUDS 0.4。当我使用以下代码调用SOAP方法时:

代码语言:javascript
复制
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')

我收到以下答复:

代码语言:javascript
复制
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'}

代码语言:javascript
复制
>>> client.options.transport.cookiejar
<cookielib.CookieJar[]>

显示没有可用的cookie。那是什么原因呢?我无法使用SOAP,因为我需要传递在响应cookie中发送的凭据。

请帮帮我。

BR

拉詹

EN

回答 1

Stack Overflow用户

发布于 2012-05-17 16:17:55

好吧,我玩过了。

首先,一个小型测试服务器(索普利布):

代码语言:javascript
复制
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头。

和一个肥皂-测试客户:

代码语言:javascript
复制
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

运行此操作将产生:

代码语言:javascript
复制
(stringArray){
   string[] = 
      "Hello, spam",
 }
<cookielib.CookieJar[<Cookie spam=eggs for .127.0.0.1/>]>

所以它会接缝工作。但是,如果将请求url更改为http://localhost:7789/?wsdl,您将得到:

代码语言:javascript
复制
(stringArray){
   string[] = 
      "Hello, spam",
 }
<cookielib.CookieJar[]>

打开客户端的cookielib日志.

代码语言:javascript
复制
import logging
import cookielib
logging.basicConfig()
logging.getLogger('cookielib').setLevel(logging.DEBUG)
cookielib.debug = True

..。它揭示了为什么:

代码语言:javascript
复制
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

哦,最后但并非最不重要的是:为什么它在行动部的问题上行不通:

端口不是域的一部分,因此带有Domain=10.242.69.4:8088的cookie将始终被拒绝。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8927624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档