Print
Category: PowerBuilder
Hits: 10509

User Rating: 5 / 5

Star ActiveStar ActiveStar ActiveStar ActiveStar Active
 

Since PowerBuilder 2017 R2, we have a new HTTPClient object, which is a base object for sending HTTP requests and receiving HTTP responses from a resource identified by a URI. Compared to the Inet object, the HTTPClient object is easier to use and supports more methods (Get/Post/Put/Delete) and more SSL protocols (TLS 1.0, TLS 1.1, TLS 1.2, SSL 2.0, and SSL 3.0).

Among other things, the HTTPClient can be also used to consume SOAP Web services. This is particularly useful as the Web Service Proxy has many limitations and defects calling SOAP Web services such as not supporting TLS 1.2. This article is to show how you can use the new HTTPClient to call your existing SOAP Web services instead. 

Call SOAP Web services using Web Service Proxy

As a background story, let's revisit how PB consumes a SOAP Web service in the past. Firstly, you need to create a Web Service Proxy and then associate it with the pbsoapclient170.pbd or import pbsoapclient170.pbx.

Then in PB IDE, you instantiate the PB proxy with the SOAP Web service link and use the SOAPConnection object to call the associated Web service methods. 

Here is the sample code:

SoapConnection conn // Define SoapConnection

n_webservicesoap proxy_obj // Declare the proxy

long rVal

integer li_rtn

string str_endpoint

str_endpoint = "http://localhost/invoice/n_webservice.asmx?WSDL"

conn = create SoapConnection  //Instantiate connection

rVal = Conn.CreateInstance(proxy_obj, "n_webservicesoap", str_endpoint)

// Create proxy object

try

  li_rtn = proxy_obj.of_add(2)     //invoke Web service of_add method.

catch(SoapException e)

   messagebox("Error", "Cannot invoke Web service")

   // Error handling  

end try

destroy conn

Call SOAP Web services using HTTPClient

With the new HTTPClient object, we have a better option to call SOAP Web service.

1. Find the Correct SOAP Web service parameters

Open the SOAP Web service on IE as shown below. Copy the associated SOAP sample request. Refer to the highlighted content below. (If you don’t see this content, please contact your service provider to get such a sample request.)

Use a third party tool like Postman to verify what protocol and arguments you need to use to successfully call the Web service API.

Note: You need to replace the argument in the XML you copied in the previous step with the real argument to call the API. In this sample, we replace the word short (data type of the parameter ai_test for the of_add method) with the real argument(2).

2. Use the HTTPClient object to call the API.

After you verified successfully with Postman, apply the same protocol and arguments to HTTPClient object in your PB code. 

Here is the sample code:

httpClient lo_client

integer li_ret , i , li_StatusCode

String lo_xml_request

string ls_url

string ls_data

string ls_body

string ls_ret

 

ls_url ="http://localhost/invoice/n_webservice.asmx"

ls_body = '<?xml version="1.0" encoding="utf-8"?>'+&

'<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" '+&

'xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+&

'  <soap:Body>'+&

'    <of_add xmlns="http://tempurl.org">'+&

'      <ai_test>2</ai_test>'+&

'    </of_add>'+&

'  </soap:Body>'+&

'</soap:Envelope>'

 

lo_client = Create httpClient

lo_client.SetRequestHeader("Content-Type", "text/xml")

lo_client.sendrequest('POST',ls_url,ls_body)

 

li_StatusCode = lo_client.GetResponseStatusCode()

ls_ret = lo_client.GetResponseStatusText( )

li_ret = lo_client.getresponsebody(  ls_data)

destroy lo_client

The new approach for calling SOAP Web services is clean and simple, and it gives you more flexibility than the previous approach. We hope that you will find this article useful in your implementation of the consumption of SOAP Web services in your applications. 

Note: If you want to use the PBDOM Object to build the XML content, you can refer to this knowledgebase.

Call simple ASP.NET Web Service using HTTPClient

1. Build a Web Service

Build a simple Web Service project based on .NET Framework, then directly add a Web Service (ASMX) object WebService into this project. 

Here below is the C# code for reference:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

/// <summary>
/// Summary description for WebService
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
// [System.Web.Script.Services.ScriptService]
public class WebService : System.Web.Services.WebService
{

    public WebService()
    {

        //Uncomment the following line if using designed components 
        //InitializeComponent(); 
    }

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }

    [WebMethod]
    public int Add(int x, int y)
    {
        return x + y;
    }
}

2. Find the correct arguments to call the WebService 

This sample Web Service has only two APIs. One is the HelloWorld method that returns a string and the other one is the Add method that has two int type input parameters and returns an int value.

First of all, use a third party tool to verify what protocol and arguments you need to use to call this Web Service API.

For example, we use Postman to verify it here.

From the result you can see the request format of the current API is different from the one we introduced in the previous section. The Content-Type should be set to application/x-www-form-urlencoded instead of application/xml.

3. Use the HTTPClient object to call the Add method of this API.

After you verified successfully with Postman, apply the same request protocol to the HTTPClient object in your PB code. 

Here below is the sample code:

httpClient 	lo_client
integer 	li_ret ,  li_StatusCode
string 		ls_url 
string 		ls_data
string 		ls_body 
string 		ls_ret

ls_url ="http://localhost:53326/WebService.asmx/Add"			
ls_body="x=7&y=8"
 
lo_client = Create httpClient
lo_client.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
lo_client.sendrequest('POST',ls_url,ls_body)

li_StatusCode = lo_client.GetResponseStatusCode()
ls_ret = lo_client.GetResponseStatusText( )
li_ret = lo_client.getresponsebody(  ls_data)
destroy lo_client
We use cookies which are necessary for the proper functioning of our websites. We also use cookies to analyze our traffic, improve your experience and provide social media features. If you continue to use this site, you consent to our use of cookies.