Java - переопределить веб-запрос на вызов веб-службы - PullRequest
0 голосов
/ 05 февраля 2020

Краткая справка, наша компания подключается к системе ERP (Sage) через веб-сервисы для некоторых функций. У нас есть код c# (. net) и java, который выполняет вызовы к веб-службе (WS). Недавно Sage ввел Basi c Authentication в свои WS.

Обратите внимание: это вопрос JAVA, но я покажу пример в C# сначала объяснить.

В программе c# я сначала создал бы объект для доступа к WS:

                var sageService = new CAdxWebServiceXmlCCServiceBasicAuth();

Затем я настроил учетную информацию:

                var sageServiceCallContext = SageFactory.Instance.GetCallContext();

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

и, наконец, вызов метода веб-службы c:

                    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;
    }

}

Что происходит сейчас, когда я выполняю любой вызов методов веб-службы, GetWebRequest из класса вызывается каждый раз. Вот как мы реализовали базовую аутентификацию в c#.

Как мне сделать это в Java?

В коде java в настоящее время я создаю объект службы (тот, который обращается к веб-службам) следующим образом:

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")));
}

локатор веб-службы выглядит следующим образом:

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;
    }
}

и метод спецификаций c в этом классе таков:

    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();
}

Поэтому у меня вопрос, как мне эмулировать переопределение , которое я вижу в. net программа в Java? Кажется, что это было бы где-то в локаторе сервиса или в invoker, но программа не использует стандартные классы http, а это adxwss. Я попробовал прямое преобразование c# в java, и это не помогло. Я видел примеры, где реализован basicAuth, но не против вызовов веб-сервисов.

* * * * * * c# довольно прост, потому что, как только я создаю объект службы с помощью переопределения basicAuth, каждый вызов веб-службы проходит через код заказа. Как это происходит в Java?

Я буду рад предоставить больше информации, если это необходимо, и я продолжу смотреть / экспериментировать, но в данный момент я иду по воде.

Добавление:

При трассировке через код java я обнаружил указанный c вызов веб-службы (запуск), в котором создается 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;
}
}

1 Ответ

0 голосов
/ 12 февраля 2020

Решение, которое я придумал, не изящно, но тогда я не гуру в Java, просто знаю достаточно, чтобы выполнить эти задачи.

Наша компания использует Sage в качестве нашей ERP-системы, а Sage имеет WSDL для определения базовых c веб-сервисов, которые она предоставляет.

Sage Web Servicew WSDL

В своей последней версии Sage они использовали базовую аутентификацию c, но не встроили ее в новый WSDL. Поскольку я не могу расширить класс (CAdxWebServiceXmlCCService), я просто скопировал / вставил новый класс CAdxWebServiceXmlCCServiceBasicAuth. Полный код показан ниже, если кому-то когда-либо приходилось иметь дело с чем-то подобным в веб-сервисе.

Ключевой момент, в котором настраивается BaiscAuth, - метод getCAdxWebService XmlCC. Я добавил setPassword и setUserName в заглушку, которая возвращается. Это достигается тем, что каждый раз, когда я выполняю вызов метода веб-сервиса, эта заглушка теперь является частью заголовка.

package com.adonix.www.WSS;

import java.net.URL;
import java.util.Base64;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;

import javax.xml.rpc.ServiceException;

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

public CAdxWebServiceXmlCCServiceBasicAuth() {
}


public CAdxWebServiceXmlCCServiceBasicAuth(org.apache.axis.EngineConfiguration config) {
    super(config);
}

public CAdxWebServiceXmlCCServiceBasicAuth(java.lang.String wsdlLoc, javax.xml.namespace.QName sName) throws javax.xml.rpc.ServiceException {
    super(wsdlLoc, sName);
}

// Use to get a proxy class for CAdxWebServiceXmlCC
private java.lang.String CAdxWebServiceXmlCC_address = "http://10.28.0.7:8124/soap-generic/syracuse/collaboration/syracuse/CAdxWebServiceXmlCC";

public java.lang.String getCAdxWebServiceXmlCCAddress() {
    return CAdxWebServiceXmlCC_address;
}

// The WSDD service name defaults to the port name.
private java.lang.String CAdxWebServiceXmlCCWSDDServiceName = "CAdxWebServiceXmlCC";

public java.lang.String getCAdxWebServiceXmlCCWSDDServiceName() {
    return CAdxWebServiceXmlCCWSDDServiceName;
}

public void setCAdxWebServiceXmlCCWSDDServiceName(java.lang.String name) {
    CAdxWebServiceXmlCCWSDDServiceName = name;
}

public com.adonix.www.WSS.CAdxWebServiceXmlCC getCAdxWebServiceXmlCC(String userName,String password) throws javax.xml.rpc.ServiceException {
   java.net.URL endpoint;
    try {
        endpoint = new java.net.URL(CAdxWebServiceXmlCC_address);
    }
    catch (java.net.MalformedURLException e) {
        throw new javax.xml.rpc.ServiceException(e);
    }
    return getCAdxWebServiceXmlCC(endpoint,userName,password);
}

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

public void setCAdxWebServiceXmlCCEndpointAddress(java.lang.String address) {
    CAdxWebServiceXmlCC_address = address;
}

/**
 * For the given interface, get the stub implementation.
 * If this service has no port for the given interface,
 * then ServiceException is thrown.
 */
public java.rmi.Remote getPort(Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException {
    try {
        if (com.adonix.www.WSS.CAdxWebServiceXmlCC.class.isAssignableFrom(serviceEndpointInterface)) {
            com.adonix.www.WSS.CAdxWebServiceXmlCCSoapBindingStub _stub = new com.adonix.www.WSS.CAdxWebServiceXmlCCSoapBindingStub(new java.net.URL(CAdxWebServiceXmlCC_address), this);
            _stub.setPortName(getCAdxWebServiceXmlCCWSDDServiceName());
            return _stub;
        }
    }
    catch (java.lang.Throwable t) {
        throw new javax.xml.rpc.ServiceException(t);
    }
    throw new javax.xml.rpc.ServiceException("There is no stub implementation for the interface:  " + (serviceEndpointInterface == null ? "null" : serviceEndpointInterface.getName()));
}

/**
 * For the given interface, get the stub implementation.
 * If this service has no port for the given interface,
 * then ServiceException is thrown.
 */
public java.rmi.Remote getPort(javax.xml.namespace.QName portName, Class serviceEndpointInterface) throws javax.xml.rpc.ServiceException {
    if (portName == null) {
        return getPort(serviceEndpointInterface);
    }
    java.lang.String inputPortName = portName.getLocalPart();
    if ("CAdxWebServiceXmlCC".equals(inputPortName)) {
        return getCAdxWebServiceXmlCC();
    }
    else  {
        java.rmi.Remote _stub = getPort(serviceEndpointInterface);
        ((org.apache.axis.client.Stub) _stub).setPortName(portName);
        return _stub;
    }
}

public javax.xml.namespace.QName getServiceName() {
    return new javax.xml.namespace.QName("http://www.adonix.com/WSS", "CAdxWebServiceXmlCCService");
}

private java.util.HashSet ports = null;

public java.util.Iterator getPorts() {
    if (ports == null) {
        ports = new java.util.HashSet();
        ports.add(new javax.xml.namespace.QName("http://www.adonix.com/WSS", "CAdxWebServiceXmlCC"));
    }
    return ports.iterator();
}

/**
* Set the endpoint address for the specified port name.
*/
public void setEndpointAddress(java.lang.String portName, java.lang.String address) throws javax.xml.rpc.ServiceException {

if ("CAdxWebServiceXmlCC".equals(portName)) {
            setCAdxWebServiceXmlCCEndpointAddress(address);
        }
        else 
{ // Unknown Port Name
            throw new javax.xml.rpc.ServiceException(" Cannot set Endpoint Address for Unknown Port" + portName);
        }
    }

/**
* Set the endpoint address for the specified port name.
*/
public void setEndpointAddress(javax.xml.namespace.QName portName, java.lang.String address) throws javax.xml.rpc.ServiceException {
    setEndpointAddress(portName.getLocalPart(), address);
}


@Override
public CAdxWebServiceXmlCC getCAdxWebServiceXmlCC() throws ServiceException {
    // TODO Auto-generated method stub
    return null;
}


@Override
public CAdxWebServiceXmlCC getCAdxWebServiceXmlCC(URL portAddress) throws ServiceException {
    // TODO Auto-generated method stub
    return null;
}

}

...