Java-在Web服务调用上覆盖WebRequest

问题描述 投票:0回答:1

快速背景,我们公司通过网络服务连接到ERP系统(Sage),以实现某些功能。我们同时具有c#(.net)和执行对Web服务(WS)的调用的Java代码。最近,Sage在其WS中引入了Basic Authentication

请注意:这是一个JAVA

问题,但我将首先在C#中显示一个示例进行说明。

在c#程序中,我首先创建一个用于访问WS的对象:

                var sageService = new CAdxWebServiceXmlCCServiceBasicAuth();

然后我设置凭证信息:

                var sageServiceCallContext = SageFactory.Instance.GetCallContext();

            sageService.Credentials = new NetworkCredential(SageUser, SagePwd);      
            sageService.PreAuthenticate = true;

然后最后调用特定的Web服务方法:

                    sageCustomerSvcResponse = sageService.run(sageServiceCallContext, "YTDPROF", sageCustomerRequestInXml);

当我设置服务对象时,我使用如下所示的自定义类:

    public class CAdxWebServiceXmlCCServiceBasicAuth : CAdxWebServiceXmlCCService
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        HttpWebRequest webRequest = (HttpWebRequest)base.GetWebRequest(uri);

        NetworkCredential credentials = Credentials as NetworkCredential;
        if (credentials != null)
        {
            string authInfo = "";
            if (credentials.Domain != null && credentials.Domain.Length > 0)
            {
                authInfo = string.Format(@"{0}\{1}:{2}", credentials.Domain, credentials.UserName, credentials.Password);
            }
            else
            {
                authInfo = string.Format(@"{0}:{1}", credentials.UserName, credentials.Password);
            };
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            webRequest.Headers["Authorization"] = "Basic " + authInfo;
        }
        return webRequest;
    }

}

现在发生了什么,当我对Web服务方法执行任何调用时,每次都会调用该类的GetWebRequest。这就是我们在c#中实现基础身份验证的方式。

如何用Java做到这一点?

目前,在Java代码中,我以这种方式创建服务对象(用于访问Web服务的对象):

WebServiceInvoker service = new WebServiceInvoker(SageWSURL,""); 

和WebServiceInvoker看起来像这样(为简洁起见被截断了:]

    public WebServiceInvoker(String url, String dummy) throws ServiceException, IOException {
    serviceLocator = new CAdxWebServiceXmlCCServiceLocator();
    service = serviceLocator.getCAdxWebServiceXmlCC(url);  
    cc = new CAdxCallContext();
    cc.setCodeLang("ENG");
    cc.setCodeUser("USER");
    cc.setPassword("PAWWORD"); 
    cc.setPoolAlias("POOL"); 
    cc.setRequestConfig("adxwss.trace.on=on&adxwss.trace.size=16384&adonix.trace.on=on&adonix.trace.level=3&adonix.trace.size=8");
    log = new PrintWriter(new BufferedWriter(new FileWriter("C:/Kalio/service/orders/log.txt")));
}

Web服务定位器看起来像这样:

public class CAdxWebServiceXmlCCServiceLocator extends org.apache.axis.client.Service implements com.adonix.www.WSS.CAdxWebServiceXmlCCService {

public CAdxWebServiceXmlCCServiceLocator() {
}

    public com.adonix.www.WSS.CAdxWebServiceXmlCC getCAdxWebServiceXmlCC() throws javax.xml.rpc.ServiceException {
   java.net.URL endpoint;
   System.out.println("using local Sage Web Servivce URL:" + CAdxWebServiceXmlCC_address);

    try {
        endpoint = new java.net.URL(CAdxWebServiceXmlCC_address);
    }
    catch (java.net.MalformedURLException e) {
        throw new javax.xml.rpc.ServiceException(e);
    }
    return getCAdxWebServiceXmlCC(endpoint);
}

public com.adonix.www.WSS.CAdxWebServiceXmlCC getCAdxWebServiceXmlCC(java.net.URL portAddress) throws javax.xml.rpc.ServiceException {
    try {
        com.adonix.www.WSS.CAdxWebServiceXmlCCSoapBindingStub _stub = new com.adonix.www.WSS.CAdxWebServiceXmlCCSoapBindingStub(portAddress, this);
        _stub.setPortName(getCAdxWebServiceXmlCCWSDDServiceName());
        return _stub;
    }
    catch (org.apache.axis.AxisFault e) {
        return null;
    }
}

并且该类中的特定方法是这样:

    public String getCustomer(String constructedXML) throws RemoteException {
    **CAdxResultXml result = service.run(cc, "XTDPROF", constructedXML);**
    CAdxMessage[] messages = result.getMessages();
    for (int i = 0; i<messages.length; i++) {
        CAdxMessage message = messages[i];
        log.println("X3 get customer message: " + message.getMessage());
        log.println("X3 get customer message type: " + message.getType());
    }
    return result.getResultXml();
}

所以我的问题是,如何模仿在Java .net程序中看到的override

?看起来它可能位于服务定位器或调用程序中的某个位置,但是该程序不使用标准的http类,而是adxwss的东西。我尝试了直接的C#到Java的转换,但这种方式没有帮助。我已经看到了实现basicAuth的示例,但没有针对Web服务调用的示例。

C#非常清楚,因为一旦我使用basicAuth覆盖创建服务对象,每个Web服务调用都会通过orderride。这在Java中是如何发生的?

如果需要,我将很乐意提供更多信息,我将继续进行查找/实验,但此刻我在努力工作。

添加:

在遍历Java代码时,我发现了特定的Web服务调用(运行),在其中创建了一个apache“调用”对象。这是可以添加basicauth的地方吗?

    public com.adonix.www.WSS.CAdxResultXml run(com.adonix.www.WSS.CAdxCallContext callContext, java.lang.String publicName, java.lang.String inputXml) throws java.rmi.RemoteException {
    if (super.cachedEndpoint == null) {
        throw new org.apache.axis.NoEndPointException();
    }
    org.apache.axis.client.Call _call = createCall();
    _call.setOperation(_operations[0]);
    _call.setUseSOAPAction(true);
    _call.setSOAPActionURI("");
    _call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
    _call.setOperationName(new javax.xml.namespace.QName("http://www.adonix.com/WSS", "run"));

    setRequestHeaders(_call);
    setAttachments(_call);
 try {        java.lang.Object _resp = _call.invoke(new java.lang.Object[] {callContext, publicName, inputXml});

    if (_resp instanceof java.rmi.RemoteException) {
        throw (java.rmi.RemoteException)_resp;
    }
    else {
        extractAttachments(_call);
        try {
            return (com.adonix.www.WSS.CAdxResultXml) _resp;
        } catch (java.lang.Exception _exception) {
            return (com.adonix.www.WSS.CAdxResultXml) org.apache.axis.utils.JavaUtils.convert(_resp, com.adonix.www.WSS.CAdxResultXml.class);
        }
    }
  } catch (org.apache.axis.AxisFault axisFaultException) {
  throw axisFaultException;
}
}

快速背景,我们公司通过网络服务连接到ERP系统(Sage),以实现某些功能。我们同时具有c#(.net)和执行对Web服务(WS)的调用的Java代码。最近的贤者...

java web-services overriding basic-authentication axis2
1个回答
0
投票

我想出的解决方案并不优雅,但是我不是Java专家,只要知道足够执行这些任务即可。

© www.soinside.com 2019 - 2024. All rights reserved.