Creating Java Client to access WSHTTPBINDING API Service

972 views Asked by At

I need to consume a web service from UltiPro in Java. All the examples from UltiPro are for C# (see below) and I cannot see how to translate the into Java.

My research indicates that the key is WSHttpBinding.

UltiPro's documentation includes an XML file that they say...

The following code is an XML example of authenticating to your UltiPro data. You can copy the entire contents and update the values in the request. The response example shows how a successful response will be formatted.

I have written many Web Services and RESTful programs before, but I am stuck on this one.

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
<a:Action   s:mustUnderstand="1">http://www.ultipro.com/services/loginservice/ILoginService/Authenticate</a:Action> 
        <h:ClientAccessKey xmlns:h="http://www.ultipro.com/services/loginservice">CAK</h:ClientAccessKey> 
        <h:Password xmlns:h="http://www.ultipro.com/services/loginservice">PASSWORD</h:Password> 
        <h:UserAccessKey xmlns:h="http://www.ultipro.com/services/loginservice">USER API KEY</h:UserAccessKey> 
        <h:UserName xmlns:h="http://www.ultipro.com/services/loginservice">USERNAME</h:UserName> 
      </s:Header>
  <s:Body>
        <TokenRequest xmlns="http://www.ultipro.com/contracts" /> 
  </s:Body>
</s:Envelope>

C# code:

namespace ConsoleSample
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Channels;

    using ConsoleSample.LoginService;

    public class Program
    {
        internal static void Main(string[] args)
        {
            // Setup your user credentials:
            const string UserName = "";
            const string Password = "";
            const string UserApiKey = "";
            const string CustomerApiKey = "";

            // Create a proxy to the login service:
            var loginClient = new LoginServiceClient("WSHttpBinding_ILoginService");

            try
            {
                // Submit the login request to authenticate the user:
                string message;
                string authenticationToken;

                AuthenticationStatus loginRequest =
                    loginClient
                        .Authenticate(
                            CustomerApiKey,
                            Password,
                            UserApiKey,
                            UserName,
                            out message,
                            out authenticationToken);

                if (loginRequest == AuthenticationStatus.Ok)
                {
                    // User is authenticated and the authentication token is provided.
                    Console.WriteLine("User authentication successful.");
                }
                else
                {
                    // User authentication has failed. Review the message for details.
                    Console.WriteLine("User authentication failed: " + message);
                }

                loginClient.Close();

                Console.WriteLine("Press a key to exit...");
                Console.ReadKey(true);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex);
                loginClient.Abort();
                throw;
            }
        }
1

There are 1 answers

0
XjSv On

I understand you are looking to write it in JAVA but maybe something from my code will help.

I was able to successfully authenticate using the following code:

<?php
$url             = 'https://rental5.ultipro.com/services/LoginService';
$action          = 'http://www.ultipro.com/services/loginservice/ILoginService/Authenticate';
$username        = 'MY_USERNAME';
$password        = 'MY_PASSWORD';
$userAccessKey   = 'MY_USER_ACCESS_KEY';
$clientAccessKey = 'MY_CLIENT_ACCESS_KEY';

$loginPayload =<<<EOD
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
        <a:Action s:mustUnderstand="1">{$action}</a:Action>
        <h:ClientAccessKey xmlns:h="http://www.ultipro.com/services/loginservice">{$clientAccessKey}</h:ClientAccessKey>
        <h:Password xmlns:h="http://www.ultipro.com/services/loginservice">{$password}</h:Password>
        <h:UserAccessKey xmlns:h="http://www.ultipro.com/services/loginservice">{$userAccessKey}</h:UserAccessKey>
        <h:UserName xmlns:h="http://www.ultipro.com/services/loginservice">{$username}</h:UserName>
    </s:Header>
    <s:Body>
        <TokenRequest xmlns="http://www.ultipro.com/contracts" />
    </s:Body>
</s:Envelope>
EOD;

$client = new SoapClient(
    null,
    array(
        'location'     => $url,
        'uri'          => '',
        'trace'        => 1,
        'encoding'     => 'UTF-8',
        'use'          => SOAP_LITERAL,
        'soap_version' => SOAP_1_2
    )
);

try {
    $order_return = $client->__doRequest($loginPayload, $url, $action, SOAP_1_2, 0);

    $getLastRequestHeaders = $client->__getLastRequestHeaders();
    $getLastRequest = $client->__getLastRequest();
    $getLastResponseHeaders = $client->__getLastResponseHeaders();
    $getLastResponse = $client->__getLastResponse();

    echo "<pre>";
    echo $getLastRequestHeaders;
    echo '<br>';
    echo $getLastResponseHeaders;
    echo '<br>';
    print_r($order_return);
    echo "</pre>";

} catch (SoapFault $exception) {
    var_dump(get_class($exception));
    var_dump($exception);
}
?>