在 python SUDS 客户端中使用复杂数据类型
我正在尝试使用 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技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
从表面上看,服务器端操作
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 tomodifyParamBean
which is both printing and returning value. Could this be your problem?I surmise that renaming (strictly for the sake of clarity)
printParamBean
togetParamBean
and having it return what you passed it, might do what you're expecting.