快速背景,我们公司通过网络服务连接到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; } }
并且该类中的特定方法是这样:
?看起来它可能位于服务定位器或调用程序中的某个位置,但是该程序不使用标准的http类,而是adxwss的东西。我尝试了直接的C#到Java的转换,但这种方式没有帮助。我已经看到了实现basicAuth的示例,但没有针对Web服务调用的示例。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
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专家,只要知道足够执行这些任务即可。