在 python SUDS 客户端中使用复杂数据类型

发布于 2024-08-28 02:19:07 字数 2937 浏览 6 评论 0原文

我正在尝试使用 SUDS 从 python 客户端调用 Web 服务。当我调用一个以复杂数据类型作为输入参数的函数时,它没有正确传递,但复杂数据类型从 Web 服务调用中正确返回。

Webservice Type:
    Soap Binding 1.1
    Document/Literal 
Webserver: 
    Weblogic 10.3 
Python Version: 2.6.5, SUDS version: 0.3.9

这是我正在使用的代码:

Python客户端:

from suds.client import Client
url = 'http://192.168.1.3:7001/WebServiceSecurityOWSM-simple_ws-context-root/SimpleServicePort?WSDL'
client = Client(url)
print client

#simple function with no operation on input...
result = client.service.sopHello()
print result
result = client.service.add10(10)
print result

params = client.factory.create('paramBean')
print params

params.intval = 10
params.longval = 20
params.strval = 'string value'
#print "params"
print params

try:
    result = client.service.printParamBean(params)
    print result
except WebFault, e:
    print e

try:
    result = client.service.modifyParamBean(params)
    print result
except WebFault, e:
    print e

print params

webservice java类:

package simple_ws;

import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;


public class SimpleService {
    public SimpleService() {

    }

    public void sopHello(int i) {
        System.out.println("sopHello: hello");
    }


    public int add10(int i) {
        System.out.println("add10:");
        return 10+i;
    }


    public void printParamBean(ParamBean pb) {
        System.out.println(pb);

    }
    public ParamBean modifyParamBean(ParamBean pb) {
        System.out.println(pb);
        pb.setIntval(pb.getIntval()+10);
        pb.setStrval(pb.getStrval()+"blah blah");
        pb.setLongval(pb.getLongval()+200);
        return pb;
    }

}

和bean类:

package simple_ws;

public class ParamBean {
    int intval;
    String strval;
    long longval;

    public void setIntval(int intval) {
        this.intval = intval;
    }

    public int getIntval() {
        return intval;
    }

    public void setStrval(String strval) {
        this.strval = strval;
    }

    public String getStrval() {
        return strval;
    }

    public void setLongval(long longval) {
        this.longval = longval;
    }

    public long getLongval() {
        return longval;
    }

    public String toString() {
        String stri = "\nInt val:" +intval;
        String strstr = "\nstrval val:" +strval;
        String strl = "\nlong val:" +longval;

        return stri+strstr+strl;
    }
}

所以,问题是这样的:

在python客户端中调用:client.service.printParamBean(params), 服务器端的输出是:

Int val:0
strval val:null
long val:0

但在调用时: client.service.modifyParamBean(params)

客户端输出是:

(reply){
   intval = 10
   longval = 200
   strval = "nullblah blah"
 }

我在这里做错了什么?

I am trying to call webservice from python client using SUDS. When I call a function with a complex data type as input parameter, it is not passed correctly, but complex data type is getting returned correctly froma webservice call.

Webservice Type:
    Soap Binding 1.1
    Document/Literal 
Webserver: 
    Weblogic 10.3 
Python Version: 2.6.5, SUDS version: 0.3.9

here is the code I am using:

Python Client:

from suds.client import Client
url = 'http://192.168.1.3:7001/WebServiceSecurityOWSM-simple_ws-context-root/SimpleServicePort?WSDL'
client = Client(url)
print client

#simple function with no operation on input...
result = client.service.sopHello()
print result
result = client.service.add10(10)
print result

params = client.factory.create('paramBean')
print params

params.intval = 10
params.longval = 20
params.strval = 'string value'
#print "params"
print params

try:
    result = client.service.printParamBean(params)
    print result
except WebFault, e:
    print e

try:
    result = client.service.modifyParamBean(params)
    print result
except WebFault, e:
    print e

print params

webservice java class:

package simple_ws;

import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;


public class SimpleService {
    public SimpleService() {

    }

    public void sopHello(int i) {
        System.out.println("sopHello: hello");
    }


    public int add10(int i) {
        System.out.println("add10:");
        return 10+i;
    }


    public void printParamBean(ParamBean pb) {
        System.out.println(pb);

    }
    public ParamBean modifyParamBean(ParamBean pb) {
        System.out.println(pb);
        pb.setIntval(pb.getIntval()+10);
        pb.setStrval(pb.getStrval()+"blah blah");
        pb.setLongval(pb.getLongval()+200);
        return pb;
    }

}

and the bean Class:

package simple_ws;

public class ParamBean {
    int intval;
    String strval;
    long longval;

    public void setIntval(int intval) {
        this.intval = intval;
    }

    public int getIntval() {
        return intval;
    }

    public void setStrval(String strval) {
        this.strval = strval;
    }

    public String getStrval() {
        return strval;
    }

    public void setLongval(long longval) {
        this.longval = longval;
    }

    public long getLongval() {
        return longval;
    }

    public String toString() {
        String stri = "\nInt val:" +intval;
        String strstr = "\nstrval val:" +strval;
        String strl = "\nlong val:" +longval;

        return stri+strstr+strl;
    }
}

so, as issue is like this:

on call: client.service.printParamBean(params) in python client,
output on server side is:

Int val:0
strval val:null
long val:0

but on call: client.service.modifyParamBean(params)

Client output is:

(reply){
   intval = 10
   longval = 200
   strval = "nullblah blah"
 }

What am i doing wrong here??

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

执笔绘流年 2024-09-04 02:19:07

从表面上看,服务器端操作 printParamBean 仅打印您传递给它的内容,但不返回任何内容。与同时打印和返回值的 modifyParamBean 相比。这可能是你的问题吗?

我推测将 printParamBean 重命名(严格为了清楚起见)为 getParamBean 并让它返回您传递的内容,可能会达到您的预期。

From the looks of it the server-side operation printParamBean is only printing what you're passing it, but is not returning anything. Compared to modifyParamBean which is both printing and returning value. Could this be your problem?

I surmise that renaming (strictly for the sake of clarity) printParamBean to getParamBean and having it return what you passed it, might do what you're expecting.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文