python解析wsdl
⑴ 在解析本地的wsdl文件时遇到如下问题,怎么解决
一、在VS提供的命令提示符中编译WSDL文件。
给个例子:
Wsdl /language:CS /n:mynamespace /out:myProxyClass.cs C:/myProject/wsdl/WEBservice.wsdl
最后一个参数是本地的绝对路径,是一个文件,也可以是一个网络路径。
二、在项目右键中添加WEB引用,输入本地的WSDL的绝对路径。
注意:用VS引用生成的代理类名称为Reference.cs,可以在项目目录下找到
⑵ 怎么解析WSDL文件中的ComplexType
客户端需要定义一个代理类PhotoItemProxy(名字随你取),这个类的数据成员和PhotoItem应该是一样的,
然后把这个xml读取到代理类PhotoItemProxy里,
客户端使用的时候,只使用代理类PhotoItemProxy,就如同使用PhotoItem类一样,
.net web server就是这么做的,
⑶ python怎么获取接口返回报文
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importsys,os
importhttplib
defsendSoapDataByHttp(strWsdl,strInterfaceName,strSoapDataFile
):
ifnot
os.path.isfile(strSoapDataFile):
return-1,"ArgumentError,SoapData:%sinvalid."%
strSoapDataFile
try:
f=open(strSoapDataFile,'r')
except
IOError,e:
return-1,"Failtoopenthefile:%s."%strSoapDataFile
lines=
f.readlines()
f.close()
SoapMessage=''' '''+''.join(lines)
##http://192.168.1.100:7654/services/abcMgntService?wsdl
pos=
strWsdl.find('/',7)
strHost=
strWsdl[7:pos]
strPostval=
strWsdl[pos:len(strWsdl)-5]
webservice=httplib.HTTP(strHost)
webservice.putrequest("POST",strPostval)
webservice.putheader("Host",strHost)
webservice.putheader("User-Agent","PythonPost")
webservice.putheader("Content-type","text/xml;
charset="UTF-8"")
webservice.putheader("Content-length","%d"%
len(SoapMessage))
webservice.endheaders()
webservice.send(SoapMessage)
#getthe
response
statuscode,statusmessage,header=webservice.getreply()
msg='
Response:%d%s headers:%s %s'%
(statuscode,statusmessage,header,webservice.getfile().read())
if
statuscode==200:
return0,msg
else:
return1,msg
defmain():
retCode,msg
=
sendSoapDataByHttp("http://192.168.1.100:7654/services/abcMgntService?wsdl
","do_interface_func","./soap_data.xml")
"Returncode:",retCode
msg
if__name__=='__main__':
main()
⑷ python 怎样生成wsdl
.如果wsdl比较复杂,比如有多个service和port,使用client.service[service][port].getBank(),
如果不指定,默认是第一service的第一个port的第一个method
下面的就可以写成这样
client.service['OtherBLZService']['soap'].getBank()
client.service[1][0].getBank()
Suds - version: 0.3.7 build: (beta) R550-20090820
Service (BLZService) tns="
Prefixes (1)
ns0 = "
Ports (2):
(soap)
Methods (1):
getBank(xs:string blz, )
(soap12)
Methods (1):
getBank(xs:string blz, )
Types (5):
getBankType
getBankResponseType
getBankType
getBankResponseType
detailsType
Service (OtherBLZService) tns="
Prefixes (1)
ns0 = "
Ports (2):
(soap)
Methods (1):
getBank(xs:string blz, )
(soap12)
Methods (1):
getBank(xs:string blz, )
Types (5):
getBankType
getBankResponseType
getBankType
getBankResponseType
detailsType
⑸ 用java 调用python webservice 是怎么调的
这次出差,我接触最多的是spss,由于项目基于j2ee开发,而java又不能直接取得spss统计结果,好在spss对python的支持还行,最终成功实现了这个模块。感谢前辈们做出的贡献,没有你们,我就不能这样迅速、顺利的完成项目,且别说写这篇文章了。
在前期准备中,我摸索、尝试了三种实现:jython,http,soap,在网上查了很多相关资料,都是只言片语,自己看了还要结合其他的资料才能弄个明白。当然,在这探索的过程中,我是幸运的,每天都让我充满惊喜,每天都有新的收获。
jython是java版本的python,也就是java的完全实现。java代码中,可以调用python的方法,缺点是,jython中导入第三方python mole时,不是那么回事。因为spss的python api主要是一个.pyd的二进制文件,jython导包是按照java的字节码来导入的,所以当在jython中导入spss的python api时会出错,这个想法彻底破灭。
http实现是在现有的B/S交互实现上突发奇想的,python中实现一个简单的web server只要几十行代码,java使用apache的httpclient访问,现在想来确实有点大材小用,自己写一个http socket来请求和响应也写不了多少代码。最后还是实现了,支持spss中文,但是数据封包都要自己来实现,还是有嫌麻烦。
soap实现最简单,server端几十行代码搞定。由于我把spss命令都封装到一个方法中执行了,所以就没有用wsdl来生成java代码了,我使用了较底层的java的http socket,手动对SOAP-ENV打包,并向server端请求,手动解析响应数据。缺点是:SOAP对中文的支持,无论怎么转码,不是python解析SOAP-ENV报错,就是python执行spss命令报错。
⑹ eclipse解析wsdl文件 怎么获取wsdl信息
一个WSDL文档通常包含7个重要的元素,即types、import、message、portType、operation、binding、 service元素。
这些元素嵌套在definitions元素中,
(1) Definitions是WSDL文档的根元素。对应于这个类: org.eclipse.wst.wsdl.Definition 其他的对象都可以通过这个对象获得
(2) Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。
(3) Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构。
(4) PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持。
(子节点) Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对。
(5) Binding - 特定端口类型的具体协议和数据格式规范的绑定。
(6) Service- 相关服务访问点的集合。
(子节点) Port - 定义为协议/数据格式绑定与具体Web访问地址组合的单个服务访问点。
下面是代码实例:
import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.wsdl.Message; import javax.wsdl.Part; import javax.wsdl.PortType; import javax.xml.namespace.QName; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.wst.wsdl.Definition; import org.eclipse.wst.wsdl.Types; import org.eclipse.wst.wsdl.internal.impl.PartImpl; import org.eclipse.wst.wsdl.internal.util.WSDLResourceFactoryImpl; import org.eclipse.wst.wsdl.util.WSDLResourceImpl; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDSchema; import org.eclipse.xsd.util.XSDResourceImpl; import org.junit.Test; import org.junit.Before; public class WSDLParserWithEclipse { Definition definition=null; String wsdlPathString="E:/HelloEclipse-EMF-WSDL-XSD/test.wsdl"; @Before public void setup(){ ResourceSet resourceSet = new ResourceSetImpl(); Resource.Factory.Registry registry = resourceSet.getResourceFactoryRegistry(); Map extensionToFactoryMap = registry.getExtensionToFactoryMap(); extensionToFactoryMap.put("wsdl", new WSDLResourceFactoryImpl()); File wsdlFile =new File(wsdlPathString); URI uri = URI.createFileURI(wsdlFile.getAbsolutePath()); // You can avoid this cast, but will have to cast anyway later to get the Definition out the resource contents WSDLResourceImpl wsdlResource = (WSDLResourceImpl) resourceSet.createResource(uri); try { wsdlResource.load(null); definition = wsdlResource.getDefinition(); }catch(Exception e){ e.printStackTrace(); } } @Test public void testTypes(){ Types types = definition.getETypes(); List schemas = types.getSchemas("http://www.xxxxx.com/problem"); XSDSchema schema = (XSDSchema) schemas.get(0); org.eclipse.xsd.util.XSDResourceImpl.serialize(System.out, schema.getElement()); } @Test public void testMessage(){ Map messages=definition.getMessages(); System.out.println("The message size is:"+messages.size()); Set setMessages=messages.keySet(); Iterator iteratorMessages=setMessages.iterator(); while(iteratorMessages.hasNext()){ QName key=(QName)iteratorMessages.next(); Message message=(Message)messages.get(key); //{http://www.xxxxx.com/problem}getKeysSoapIn //System.out.println("Message Name:"+message.getQName()); if(message.getQName().toString().indexOf("getKeysSoapIn")>0){ System.out.println("Message Name:"+message.getQName()); Map partsMap=message.getParts(); //org.eclipse.xsd.impl.XSDElementDeclarationImpl System.out.println("Message Part size for getKeysSoapIn message is:"+partsMap.size()); PartImpl part= (PartImpl)partsMap.get("problem"); XSDElementDeclaration xsdElementDeclaration=part.getElementDeclaration(); XSDResourceImpl.serialize(System.out, xsdElementDeclaration.getElement()); } } } @Test public void testPortType(){ Map portTypes=definition.getPortTypes(); System.out.println("Port Type size:"+portTypes.size()); if(portTypes!=null&&portTypes.size()>0){ Set set=portTypes.keySet(); Iterator iterator=set.iterator(); while(iterator.hasNext()){ QName object=(QName)iterator.next(); PortType portType=(PortType)portTypes.get(object); System.out.println("Port Type name:"+portType.getQName()); org.eclipse.xsd.util.XSDResourceImpl.serialize(System.out, portType.getDocumentationElement()); } } } }
⑺ 如何调用别人提供的webservice接口
在项目中选择【控制台应用程序】,点击项目右键,选择添加->服务引用。在地址栏中输入WebServie链接地址后回车,点击确定后在代码中就可以看到添加的服务应用了,详细步骤:
1、首先打开VS2013,选择文件->新建->项目。
⑻ wsdl4j 如何解析import的wsdl文件
请问如何解析WSDL文件中的复杂类型 ? 比如说服务端定义了一个类PhotoItem,客户端需要定义一个代理类PhotoItemProxy(名字随你取),这个类的数据成员和,Ivsspv
⑼ python suds wsdl 用户么
最近做接口对接,遇到了.net开发的webservice接口,因为python第一次与webservice对接,连问带查,最后使用suds库来实现了
1.安装suds
mac: sudo pip install suds
linux: easy_install suds
也可以通过去官网下载suds代码,再本地安装
2. 引用初始化
1 >>> from suds.client import Client
2 >>> url = ''
3 >>> client = Client(url)
4 >>> print client
5
6 Suds ( ) version: 0.4 GA build: R699-20100913
7
8 Service ( Kuaidi ) tns=""
9 Prefixes (1)
10 ns0 = ""
11 Ports (2):
12 (KuaidiSoap)
13 Methods (1):
14 KuaidiQuery(xs:string Compay, xs:string OrderNo, )
15 Types (1):
16 ApiSoapHeader
17 (KuaidiSoap12)
18 Methods (1):
19 KuaidiQuery(xs:string Compay, xs:string OrderNo, )
20 Types (1):
21 ApiSoapHeader
22 >>>
对url做一下说明,一般要确认给的wsdl地址是正常模式,地址打开一般为xml格式而有些服务是做成了html模式,这个会导致实例化或者调用方法的时候出现xml解析异常。
3. 方法调用
2中的client打印出来就可以知道,该webserviece服务定义了什么方法,方法需要什么参数,声明了什么信息等(如头信息,ApiSoapHeader),方法可以通过client.serviece直接调用
>>> client.service.KuaidiQuery(Company='EMS', OrderNo='1111')
(KuaidiQueryResult){
API =
(API){
RESULTS = "0"
MESSAGE = "接口查询成功"
}
}
>>>
而声明的头信息,则可以用factory的方式去实例化
>>> header = client.factory.create('ApiSoapHeader')
>>> print header
(ApiSoapHeader){
APICode = None
APIKey = None
}
>>> header.APICode = '123'
>>> header.APIKey = 'key123'
>>> print header
(ApiSoapHeader){
APICode = "123"
APIKey = "key123"
}
>>>
头信息需要用set_options方法设置
>>>
>>> client.set_options(soapheaders=[header,])
>>>
⑽ soapui解析wsdl文件报错,如何解决
这个问题,我刚才解决了:
是有一个证书认证,将tomcat中server.
xml文件
中clientAuth="
true
",改为clientAuth="
want"这样就没问题,add
wsdl路径没有问题。