Java WSDL DHL Классы - PullRequest
       51

Java WSDL DHL Классы

0 голосов
/ 11 октября 2018

Я создал классы Java из DHL WSDL https://cig.dhl.de/cig-wsdls/com/dpdhl/wsdl/geschaeftskundenversand-api/2.2/geschaeftskundenversand-api-2.2.wsdl.

Теперь у меня есть все классы, но нет класса аутентификации.Я пробую это

 GKVAPIServicePortTypeProxy port2 = new GKVAPIServicePortTypeProxy();
        port2.setEndpoint("https://cig.dhl.de/services/sandbox/soap");

     CreateShipmentOrderRequest sh = new CreateShipmentOrderRequest();
        //Setting up shipment;
        .. and so on

        CreateShipmentOrderResponse chr = port2.createShipmentOrder(sh);

Но только то, что я получаю, "(401) Требуется авторизация" Как я могу установить свою аутентификацию?

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Привет! Я исправил проблему 401 с добавлением сертификата ssl от DHL в мое хранилище доверенных сертификатов.Но у меня есть проблема, которую я пропустил, чтобы добавить блок Authentification к запросу.

<soapenv:Header>
      <cis:Authentification>
         <cis:user>user</cis:user>
         <cis:signature>password</cis:signature>
      </cis:Authentification>
 </soapenv:Header>

Моя попытка добавить этот блок приводит к 'org.quartz.jobexecutionexception: de.vps.icms.exceptions.icmsscriptingexception: java.lang.noclassdeffounderror: org / apache / axis2 / saaj / soapenvelopeimpl'exception.

Какая-то идея, что я сделал не так?Вот код: открытый класс WSClient {

   public WSClient() {
        try {
            GKVAPIServicePortType port = prepareService();
            String b = BWIConstants.SYSPARAM_DHL_WS_URL;
            CreateShipmentOrderRequest createShipmentOrderRequest = new CreateShipmentOrderRequest();
            CreateShipmentOrderResponse createShipmentOrderResponse =
                port.createShipmentOrder(createShipmentOrderRequest);
            createShipmentOrderResponse.getStatus();

        } catch (Exception e) {
            e.printStackTrace();

        }

    }

    private GKVAPIServicePortType prepareService() throws MalformedURLException {
        // get Service stub

        String pathToClassFolder = getClass().getResource("/").toString();
        String fullwsdlFilePath = pathToClassFolder + "/" + "geschaeftskundenversand-api-2.2.wsdl";
        URL wsdlLocation = new URL(fullwsdlFilePath);

        GVAPI20De service = new GVAPI20De(wsdlLocation);

        // get Service Port
        GKVAPIServicePortType port = service.getPort(GKVAPIServicePortType.class);

        // overwrite Endpoint
        Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext();
        requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://cig.dhl.de/services/sandbox/soap");

        // overwrite BasicAuth Username and Password
        // requestContext.put(BindingProvider.USERNAME_PROPERTY, cigUser);
        // requestContext.put(BindingProvider.PASSWORD_PROPERTY, cigPass);

        // Add authentication Handler
        Binding binding = ((BindingProvider) port).getBinding();
        List<Handler> handlerChain = binding.getHandlerChain();
        handlerChain.add(
            new AuthenticationHandler(BWIConstants.SYSPARAM_DHL_WS_USER, BWIConstants.SYSPARAM_DHL_WS_SIGNATURE));
        binding.setHandlerChain(handlerChain);

        return port;
    }

}

public class AuthenticationHandler implements SOAPHandler<SOAPMessageContext> {

    private String USER = "";
    private String PASSWORD = "";

    public AuthenticationHandler(final String user, final String password) {
        USER = user;
        PASSWORD = password;
    }

    /**
     * {@inheritDoc}
     */
    public void close(final MessageContext context) {
        // nothing to do
    }

    /**
     * {@inheritDoc}
     */
    public Set<QName> getHeaders() {
        // nothing to do
        return null;
    }

    /**
     * {@inheritDoc}
     */
    public boolean handleFault(final SOAPMessageContext context) {
        // nothing to do
        return true;
    }

    /**
     * {@inheritDoc}
     */
    public boolean handleMessage(final SOAPMessageContext context) {
        if (isOutboundMessage(context)) {
            try {
                // get/create the map of HTTP headers
                Map<Object, Object> headers = (Map<Object, Object>) context.get(MessageContext.HTTP_REQUEST_HEADERS);
                if (headers == null) {
                    headers = new HashMap<Object, Object>();
                    context.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
                }

                // add custom HTTP header (deactivate HTTP keepAlive)
                String headerName = "Connection";
                List<String> headerValues = new ArrayList<String>();
                headerValues.add("Close");
                headers.put(headerName, headerValues);

                SOAPMessage message = context.getMessage();
                SOAPEnvelope envelope = message.getSOAPPart().getEnvelope();

                SOAPHeader header;
                if (envelope.getHeader() == null) {
                    header = envelope.addHeader();
                } else {
                    header = envelope.getHeader();
                }

                // add the Authentification element
                SOAPElement auth = header.addHeaderElement(
                    envelope.createName("Authentification", "cis", "http://dhl.de/webservice/cisbase"));
                SOAPElement user =
                    auth.addChildElement(envelope.createName("user", "cis", "http://dhl.de/webservice/cisbase"));
                user.setValue(USER);
                SOAPElement signature =
                    auth.addChildElement(envelope.createName("signature", "cis", "http://dhl.de/webservice/cisbase"));
                signature.setValue(PASSWORD);
                SOAPElement type =
                    auth.addChildElement(envelope.createName("type", "cis", "http://dhl.de/webservice/cisbase"));
                type.setValue("0");

                // save changes
                message.saveChanges();
            } catch (SOAPException ex) {
                throw new RuntimeException("Failed to add SOAP headers for authentication.", ex);
            }
        }
        return true;
    }

    private boolean isOutboundMessage(final MessageContext context) {
        Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        return outboundProperty.booleanValue();
    }
}
0 голосов
/ 12 октября 2018

Используя базовую аутентификацию, вы сначала закодируете Base64 своим именем пользователя: паролем - есть онлайн-сайты, которые это сделают, но остерегайтесь, скорее всего, не самая лучшая идея, если это в любом случае относится к DHL, например, они могут смахнуть ваши учетные данные.Затем вы получаете запрос контекста порта, создаете карту заголовков и добавляете заголовок авторизации.Наконец, вы добавляете это обратно в контекст запроса. Пример: Обратите внимание, я специально сгенерировал некорректную кодировку base64, чтобы вы, вероятно, не смогли ее декодировать и увидеть, как она правильно отформатирована с помощью «username: password»

        GVAPI20De service1 = new GVAPI20De();

        GKVAPIServicePortType port2 = service1.getGKVAPISOAP11Port0();

        CreateShipmentOrderRequest sh = new CreateShipmentOrderRequest();
        //Setting up shipment;

        Map<String, Object> req_ctx = ((BindingProvider)port2).getRequestContext();

        //you may not need this and can try commenting it out
        req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://cig.dhl.de/cig-wsdls/com/dpdhl/wsdl/geschaeftskundenversand-api/2.2/geschaeftskundenversand-api-2.2.wsdl");

        //optional timeout
        req_ctx.put("javax.xml.ws.client.connectionTimeout", "60000");

        Map<String, List<String>> headers = new HashMap<String, List<String>>();
        headers.put("Authorization", Collections.singletonList("Basic c3gh567sd4689k11lg=="));

        req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

        CreateShipmentOrderResponse chr = port2.createShipmentOrder(sh)
...