我正在尝试创建一些宁静的网络服务,这将为公司的cisco手机增加一些功能。基本思路很简单,用户得到一个小客户端,他们需要输入登录名和密码。当他们这样做时,他们的电话/电话被“注册”到我的休息服务中,并且他们在手机上获得了附加功能。当他们退出时,他们会被取消注册。为了提供额外的功能(如调整的呼叫者信息等),我需要Cisco AXL API。这是一个基于SOAP的API。我已经使用wsdl生成了java类。当我使用生成的类创建一个testclient时,一切正常。
但问题出现了:当我的应用程序部署在我的Tomcat 7容器上时,当我尝试运行soap请求时,它不再起作用了。
问题似乎是AXLAPIService,它在执行以下代码时挂起:
@WebEndpoint(name = "AXLPort")
public AXLPort getAXLPort() {
return super.getPort(new QName("http://www.cisco.com/AXLAPIService/", "AXLPort"), AXLPort.class);
}
换句话说,我没有获得soap请求的端口,如果等待的时间太短,它会导致tomcat崩溃。
我去谷歌搜索。某个论坛上的某人曾因为过时的stax版本而出现问题。我在我的POM中调整了stax版本并再次尝试,没有任何帮助。
我还在某处读到了底层javax.xml.ws.Service实际上有一个端口的枚举,当你执行getPort()时,你将获得最合适的端口。然后我查找了SOAP的默认端口,它将是80,就像用于RESTful服务的端口一样。可能是肥皂服务需要端口80,但它不能拥有它,因为它已经在使用?
所以,总结一下我的问题:
作为附加信息,这是axl wsdl定义服务的方式:
<service name="AXLAPIService">
<port binding="s0:AXLAPIBinding" name="AXLPort">
<soap:address location="https://CCMSERVERNAME:8443/axl/"/>
</port>
我正在考虑自己改变肥皂口。一些谷歌搜索告诉我,我应该在wsdl中这样做,但我真的不知道如何。已经有帖子here但是我没看到另一个端口名的绑定如何帮助我....
答案 0 :(得分:0)
与涉及Cisco Telephony及其管理XmL(AXL)的许多事情一样,我找到了一种解决方法而不是实际的答案。由于一个问题从未真正留下我的想法,我昨天花了很长时间试图找到一个解决方案,从AXL中获取信息。
但仍然欢迎对上述问题的任何实际答案。
我找到的解决方法是this:由于SOAP可以被视为特殊的http POST请求,因此应该可以使用REST框架(如Jersey)进行SOAP调用。您只需要一些额外的代码就可以使它工作。我使用了链接中的'SoapProvider',对于那些也在努力解决这个问题的人,我将添加我的代码:
public void doSoapRequest() throws SOAPException, JAXBException{
ClientConfig config = new DefaultClientConfig();
config.getClasses().add(SoapProvider.class);
Client c = Client.create(config);
c.addFilter(new LoggingFilter());
c.addFilter(new HTTPBasicAuthFilter("user", "password"));
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();
SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();
SOAPElement bodyElement = body.addChildElement(envelope.createName("getCCMVersion", "", "http://www.cisco.com/AXL/API/8.5"));
message.saveChanges();
WebResource service = c.resource("https://youraxlmachine:8443/axl/");
// POST the request
ClientResponse cr = service.type(MediaType.TEXT_XML).header("SOAPAction", "\"https://youraxlmachine:8443/axl/getCCMVersion\"").post(ClientResponse.class, message);
message = cr.getEntity(SOAPMessage.class);
JAXBContext ctx = JAXBContext.newInstance(GetCCMVersionRes.class);
Unmarshaller um = ctx.createUnmarshaller();
GetCCMVersionRes response = (um.unmarshal(message.getSOAPPart().getEnvelope().getBody().extractContentAsDocument(), GetCCMVersionRes.class)).getValue();
System.out.println("HERE COMES THE VERSION!");
System.out.println(response.getReturn().getComponentVersion().getVersion());
}
除了公司的具体细节外,我尽可能多地保留不变的东西。此代码适用于获取CCM版本。
警告:根据您执行请求的方式,您可能会针对同一请求获得不同的结果。我会解释一下:
我也实现了其他AXL方法,例如getUser。在我编写Jersey soap服务之前,我尝试使用SOAPUI。所以我设置了SOAPUI,因此我可以对AXL服务器执行RESTful请求。使用我在SOAPUI中的restful设置,我获得了与使用SOAPUI和我在java中首次实现soapclient的标准SOAP调用时相同的结果。
但是当我使用jersey客户端执行相同的getUser请求时,结果中缺少一些重要的字段。我不知道是什么导致了这一点。对于请求getPhone,我甚至得不到有效的回复。所以请注意。