Java - 发送SOAP标头(用于身份验证)

时间:2021-08-14 09:57:11

I've generated some Java code from a wsdl file and the request itself seems to be working, but I can't send my credentials.

我从wsdl文件生成了一些Java代码,请求本身似乎正在工作,但我无法发送我的凭据。

I've tested the Webservice with a tool called "SoapUI" and everything seemes to be working like a charm.

我用一个名为“SoapUI”的工具测试了Webservice,所有东西看起来都像魅力一样。

Here is an example of the (working) xml:

以下是(工作)xml的示例:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:beac="url">
  <soapenv:Header>
    <nsAuthn:authnHeader xmlns:nsAuthn="url/auth">
      <nsAuthn:id>id</nsAuthn:id>
      <nsAuthn:password>password</nsAuthn:password>
    </nsAuthn:authnHeader>
  </soapenv:Header>
  <soapenv:Body>
    <beac:getData>
      <saisonid>int</saisonid>
    </beac:getData>
  </soapenv:Body>
</soapenv:Envelope>

And this is my attempt:

这是我的尝试:

public RankDtoResponse getData(int saisonid) throws java.rmi.RemoteException, SOAPException {
    if (super.cachedEndpoint == null) {
        throw new org.apache.axis.NoEndPointException();
    }

    SOAPHeaderElement authentication = new SOAPHeaderElement("url","auth");
    SOAPHeaderElement user = new SOAPHeaderElement("url","id", "id");
    SOAPHeaderElement password = new SOAPHeaderElement("url","password", "password");
    try {
        authentication.addChild(user);
        authentication.addChild(password);
    } catch (SOAPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    org.apache.axis.client.Call _call = createCall();
    _call.setOperation(_operations[3]);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("");
    _call.setEncodingStyle(null);
    _call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR, Boolean.FALSE);
    _call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS, Boolean.FALSE);
    _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS); 
    _call.setOperationName(new javax.xml.namespace.QName("url", "getData"));


    setHeader(authentication);
    setRequestHeaders(_call);
    setAttachments(_call);
    try {        java.lang.Object _resp = _call.invoke(new java.lang.Object[] {new java.lang.Integer(saisonid)});

    if (_resp instanceof java.rmi.RemoteException) {
        throw (java.rmi.RemoteException)_resp;
    }
    else {
        extractAttachments(_call);
        try {
            return (RankDtoResponse) _resp;
        } catch (java.lang.Exception _exception) {
            return (RankDtoResponse) org.apache.axis.utils.JavaUtils.convert(_resp, RankDtoResponse.class);
        }
    }
    } catch (org.apache.axis.AxisFault axisFaultException) {
      if (axisFaultException.detail != null) {
        if (axisFaultException.detail instanceof java.rmi.RemoteException) {
          throw (java.rmi.RemoteException) axisFaultException.detail;
        }
        if (axisFaultException.detail instanceof SOAPException) {
          throw (SOAPException) axisFaultException.detail;
        }
    }
    throw axisFaultException;
  }  
}

Error:

错误:

AxisFault
faultCode: 1-1-3
faultSubcode: 
faultString: Could not authenticate, credentials not specified
faultActor: 
faultNode: 
faultDetail: 
  {http://xml.apache.org/axis/}stackTrace:Could not authenticate, credentials not specified
  at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
  at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
  at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
  at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source)
  at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
  at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
  at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
  at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
  at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
  at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
  at org.apache.axis.client.Call.invoke(Call.java:2767)
  at org.apache.axis.client.Call.invoke(Call.java:2443)
  at org.apache.axis.client.Call.invoke(Call.java:2366)
  at org.apache.axis.client.Call.invoke(Call.java:1812)
  at getData.getData(getData.java:496)
  at Client.main(Client.java:20) 

Most of the code is autogenerated from a wsdl file by wsdl2java.

大多数代码都是由wsdl2java从wsdl文件自动生成的。

Do you need any more information? Am I missing something out?

您还需要更多信息吗?我错过了什么吗?

Thanks in advance

提前致谢

2 个解决方案

#1


0  

Your code looks good to me, so not sure where is actual problem. But rather then modifying stub class, I have done it while invoking the service method. Your code should look something like below and you could remove your code modifications to generated stub class, and it should work.

你的代码看起来不错,所以不确定实际问题在哪里。而不是修改存根类,我已经在调用服务方法时完成了它。您的代码应如下所示,您可以删除对生成的存根类的代码修改,它应该可以工作。

OMNamespace hdrNs =  
        OMAbstractFactory.getOMFactory().createOMNamespace("url/auth", "nsAuthn");  
SOAPHeaderBlock header = OMAbstractFactory.getSOAP12Factory().createSOAPHeaderBlock("authnHeader", hdrNs);  
header.addChild(AXIOMUtil.stringToOM("<id>$id</id>"));
header.addChild(AXIOMUtil.stringToOM("<password>$id</password>"));  
stub._getServiceClient().addHeader(header);  

Hope it will help!

希望它会有所帮助!

#2


0  

I've used this approach and since you already have an example for adding data to the body, creating and adding something to the header was just as simple. Just had to get the Header with envelope.getHeader() and add my header data to it.

我已经使用过这种方法,因为你已经有了一个向主体添加数据的例子,所以在标题中创建和添加内容也同样简单。只需要使用envelope.getHeader()获取Header并将我的标题数据添加到它。

Thanks for the help!

谢谢您的帮助!

#1


0  

Your code looks good to me, so not sure where is actual problem. But rather then modifying stub class, I have done it while invoking the service method. Your code should look something like below and you could remove your code modifications to generated stub class, and it should work.

你的代码看起来不错,所以不确定实际问题在哪里。而不是修改存根类,我已经在调用服务方法时完成了它。您的代码应如下所示,您可以删除对生成的存根类的代码修改,它应该可以工作。

OMNamespace hdrNs =  
        OMAbstractFactory.getOMFactory().createOMNamespace("url/auth", "nsAuthn");  
SOAPHeaderBlock header = OMAbstractFactory.getSOAP12Factory().createSOAPHeaderBlock("authnHeader", hdrNs);  
header.addChild(AXIOMUtil.stringToOM("<id>$id</id>"));
header.addChild(AXIOMUtil.stringToOM("<password>$id</password>"));  
stub._getServiceClient().addHeader(header);  

Hope it will help!

希望它会有所帮助!

#2


0  

I've used this approach and since you already have an example for adding data to the body, creating and adding something to the header was just as simple. Just had to get the Header with envelope.getHeader() and add my header data to it.

我已经使用过这种方法,因为你已经有了一个向主体添加数据的例子,所以在标题中创建和添加内容也同样简单。只需要使用envelope.getHeader()获取Header并将我的标题数据添加到它。

Thanks for the help!

谢谢您的帮助!