使用AXL的RESTful服务

使用AXL的RESTful服务,rest,soap,Rest,Soap,我正在尝试创建一些restful Web服务,为公司的cisco手机添加一些功能。其基本思想很简单,用户获得一个小客户端,需要在该客户端上输入登录名和密码。当他们这样做时,他们的手机会“注册”到我的restful服务中,并在手机上获得附加功能。当他们注销时,他们会被注销。为了提供额外的功能(如调整呼叫方信息等),我需要Cisco AXL API。这是一个基于SOAP的API。我已经使用wsdl生成了java类。当我使用生成的类创建一个testclient时,一切都正常 但是问题来了:当我的应用程

我正在尝试创建一些restful Web服务,为公司的cisco手机添加一些功能。其基本思想很简单,用户获得一个小客户端,需要在该客户端上输入登录名和密码。当他们这样做时,他们的手机会“注册”到我的restful服务中,并在手机上获得附加功能。当他们注销时,他们会被注销。为了提供额外的功能(如调整呼叫方信息等),我需要Cisco AXL API。这是一个基于SOAP的API。我已经使用wsdl生成了java类。当我使用生成的类创建一个testclient时,一切都正常

但是问题来了:当我的应用程序部署在Tomcat7容器上时,当我尝试运行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服务的端口一样。可能是soap服务需要端口80,但它不能拥有端口80,因为它已经在使用中了吗

因此,总结一下我的问题:

  • 我的restful服务是否会使用与soap相同的端口 您希望使用什么请求
  • 如果没有,那么会出现什么问题?我应该如何解决
作为附加信息,以下是axl wsdl定义服务的方式:

<service name="AXLAPIService">
<port binding="s0:AXLAPIBinding" name="AXLPort">
  <soap:address location="https://CCMSERVERNAME:8443/axl/"/>
</port>


我正在考虑自己更改soap端口。一些谷歌告诉我应该在wsdl中这样做,但我不知道怎么做。已经有帖子了,但我看不到绑定另一个端口名如何帮助我……

由于涉及Cisco Telephony及其管理XmL(AXL)的很多事情,我找到了一个解决方法,而不是实际的答案。由于我从来没有真正忘记过一个问题,所以我花了昨天剩下的时间试图找到一个从AXL事件中获取信息的解决方案

尽管如此,对上述问题的任何实际答案仍然是受欢迎的

我发现的解决方法是:由于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请求,我甚至没有得到有效的响应。因此,请注意