我正在开发一个SOAP Web服务.其中一个函数是isAlive().它没有输入参数.WSDL的最佳实践是什么?我试过了...
<wsdl:operation name="isAlive">
<wsdl:output message="tns1:isAliveMessage"/>
</wsdl:operation>
Run Code Online (Sandbox Code Playgroud)
...但由于缺少输入,我的一个工具中出现了解析错误.我找到了几个例子,其中定义了输入和消息,相应的类型定义是空的,即<xsd:complexType name="somename"/>.这是否更好?
谢谢!
我正在尝试在.NET 3.5中构建一个支持SOAP的C#服务 - 并显示WSDL和REST.
SOAP服务和WSDL生成很容易使用ServiceHost和BasicHttpBinding类.得到了工作,客户很高兴.
由于SOAP调用所有使用的简单参数,因此客户端开发人员为某些命令请求了REST接口.所以我改变了的ServiceHost类的WebServiceHost,根据需要添加WebInvoke和WebGet属性,增加了一个WebHttpBinding班,和宾果- REST和SOAP进行了两个工作了一个服务.很酷,改变一个界面,REST和SOAP都得到了新的东西.
但是有一个问题 - 不再生成WSDL.我无法浏览到http:// server/service?wsdl并获取WSDL文件.检查MSDN文档,这似乎是默认行为WebServiceHost.
问题:我可以覆盖此行为以便可以获取WSDL吗?没有与以前相同的URL - 它可以更改 - 但我只需要在服务中使用一些URL来为这些SOAP开发人员获取WSDL.
我无法打开元数据网址http://localhost:8082/Tasks/mex,即使我在配置文件中添加了mexHttpBinding.我可以在浏览器中查看此MEX端点吗?
配置文件如下所示:
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
Run Code Online (Sandbox Code Playgroud)
问题:
我正在寻找Java的SOAP客户端.
Apache Axis对我来说看起来很臃肿.我不明白为什么Java必须如此复杂.例如,在PHP中,我所要做的就是:
<?php
$global_service_wsdl='https://api.betfair.com/global/v3/BFGlobalService.wsdl';
$betfair=new SoapClient($global_service_wsdl);
$params=array("request"=>
array("header"=>
array("clientStamp"=>0,"sessionToken"=>$session_token)),"locale"=>""
);
$response=$betfair->getAllEventTypes($params);
?>
Run Code Online (Sandbox Code Playgroud)
我的$ response对象包含我需要的所有信息.
任何人都可以建议我如何在没有太多麻烦的情况下在Java中实现这样的东西?
提前谢谢了,
〜编辑1~
@jarnbjo:
这对我来说非常有用.我坚持的一点是我需要输入什么来运行代码?
我运行了这个命令:sh wsdl2java.sh -o output -a -uri https://api.betfair.com/global/v3/BFGlobalService.wsdl
并建立了输出.你认为这比PHP快吗?另外,我有一个"异步"选项.这是否意味着我可以进行异步调用?那将非常有用.我想在基于Java的websocket服务器中运行所有这些.
是否有充分的理由在不使用WSDL"文件"的情况下部署或使用SOAP服务?
说明:
我遇到的情况是第三方创建的SOAP服务不遵循他们也创建的WSDL文件.我想我不得不忽略WSDL文件才能使用这个服务.因此我正在研究如何做到这一点.
我真正想知道为什么甚至可以做到这一点?意图是什么?
它的设计是为了让我们可以使用穷人程序员提供的糟糕服务吗?当然必须有更好的理由.我几乎希望它不可能.然后我可以要求他们正确地写出来.
我正在尝试基于WSDL文件在Eclipse Java EE IDE(Helios Service Release 2,Windows 7 32位)中创建Web服务,但是当我在创建向导中单击"完成"时,我总是得到:
IWAB0014E发生意外异常.
(details: java.lang.NullPointerException
at org.eclipse.jst.ws.internal.axis.creation.ui.widgets.skeleton.SkeletonConfigWidgetDefaultingCommand.getOutputJavaFolder(SkeletonConfigWidgetDefaultingCommand.java:86)
at org.eclipse.jst.ws.internal.axis.creation.ui.widgets.skeleton.SkeletonConfigWidgetDefaultingCommand.execute(SkeletonConfigWidgetDefaultingCommand.java:47)
at org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentEngine.runCommand(CommandFragmentEngine.java:419)
at **...**)
Run Code Online (Sandbox Code Playgroud)
我100%确定WSDL文件是正确的 - 无论文件是多么微不足等,都会发生错误.
我这样做的方式:
我正在使用Tomcat 6.0服务器(localhost),但我认为这是无关紧要的.
任何有关如何解决这个问题的提示将不胜感激.
我正在开发一个涉及20多个不同WebServices的相当大的WS项目.这些Web服务虽然彼此独立,但它们共享一组相当大的常见类型.我们在构建脚本中使用wsimport作为ant目标来生成代理类.
问题:随着我们的WS(和相应的WSDL)的数量增加,我们注意到我们的代理类的构建时间已经非常陡峭.经过进一步的调查(和分析),我们发现wsimport花费了大量的构建时间来重复生成常见类型.它已经达到了这样的程度,即生成,编译和打包这些代理类及其常见类型大约需要15-20分钟.这对我们来说是一个问题,我们正在寻找缩短构建时间的方法.
问题:有没有办法只生成一次常见类型?我研究了谷歌搜索找到的一些解决方案.一个是编写WSDL累加器,它解析WSDL并将它们组合成一个WSDL,因此wsimport只被调用一次.另一个暗示使用剧集文件,但进一步调查只是表明使用这种方法存在问题.
注意:我看过一些较旧的类似问题,但没有一个有任何答案.
我有一个Web api控制器类,我在从Web api控制器的WSDL生成的代理类上调用一个方法,然后返回一个WSDL代理类中定义的类型的对象.
但返回的xml/json包含代理类的私有成员
私人会员是
private string companyField;
private string soldBPField;
private string fromDateField;
private string toDateField;
private long succStatusField;
Run Code Online (Sandbox Code Playgroud)
并且返回的xml是:
<companyField>700</companyField>
<soldBPField>999000353</soldBPField>
<fromDateField>01-01-2012</fromDateField>
<toDateField>01-01-2013</toDateField>
Run Code Online (Sandbox Code Playgroud)
返回的json也很相似
我更改了global.asax中的xml格式化程序,如下所示:
var xml = GlobalConfiguration.Configuration.Formatters.XmlFormatter;
xml.UseXmlSerializer = true;
Run Code Online (Sandbox Code Playgroud)
这改变了返回的XML:
<company>700</company>
<soldBP>999000353</soldBP>
<fromDateField>01-01-2012</fromDate>
<toDate>01-01-2013</toDate>
Run Code Online (Sandbox Code Playgroud)
但是返回的json仍然包含私有变量的名称
谁能帮我这个
我在创建Java客户端并将其连接到正在运行的Web Service时遇到问题.
我使用以下代码:
Service myService = null;
URL wsdlLocation = new URL("http://myservice?wsdl");
QName serviceName = new QName(wsdlLocation, "MyService");
Service myService = new Service(wsdlLocation, serviceName);
Run Code Online (Sandbox Code Playgroud)
使用以下命令创建Service类的位置:
wsimport -d gen -keep http://myservice?wsdl
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用Apache cxf 2.4的wsdl2java生成的客户端,但得到了相同的结果.
(我已经在我使用原始代码的代码中更改了此帖子的WSDL位置和服务类名称.)
但是当我使用新的Service()命令创建服务时,我在appserver上调用Web Service时遇到异常.但是:我用SOAP UI测试了wsdl位置,它运行得很好.此外,我使用Soap UI创建了一个模拟服务,我的Java客户端可以连接到它,调用它并获得结果.当我想要调用在appserver上运行的Web服务时,会出现问题.
堆栈跟踪:
javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:149)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:98)
at javax.xml.ws.Service.<init>(Service.java:76)
at MyService.<init>(MyService.java:42)
at mypackage.createService(AClass.java:288)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:100)
at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:199)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:147)
... 12 more …Run Code Online (Sandbox Code Playgroud) 我在客户端站点上有一个Web服务,我需要从中报告.
在本地,我使用提供的wsdl模仿服务,并且能够报告这些.但是,现在指向客户端站点我无法访问数据,因为服务需要包含ws寻址头.
网络服务期待如下:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:add="http://www.w3.org/2005/08/addressing" xmlns:ns="CustomerNamespace" xmlns:sch="Schema.xsd">
<soapenv:Header>
<add:From>
<add:Address>Something</add:Address>
<add:ReferenceParameters>
<ns:TransactionGroupID>SomeOtherThing</ns:TransactionGroupID>
<ns:SenderID>911</ns:SenderID>
</add:ReferenceParameters>
</add:From>
<add:Action>Request</add:Action>
<add:MessageID>TestGUID</add:MessageID>
</soapenv:Header>
<soapenv:Body>
<sch:Request>
<sch:SearchCustomerSystem>SystemXYZ</sch:SearchCustomerSystem>
<sch:ServiceID>999999999999</sch:ServiceID>
</sch:Request>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
目前,我可以通过以下方式获得SSRS:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Request xmlns="Schema.xsd">
<ServiceID>
999999999999
</ServiceID>
</Request>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
除了创建自定义数据扩展(我宁愿避免)之外,还有一种方法可以将ws寻址标头放入请求中吗?