Connect to webservice using HTTP POST-trigger - Forum - Rollbase - Progress Community

Connect to webservice using HTTP POST-trigger

 Forum

Connect to webservice using HTTP POST-trigger

This question is answered

Hi.

can anybody help me?

in Rollbase Privatecloud we want to post to a webservice using the HTTP POST-trigger.

How can i authenticate using header information?

i have tried:

Authorization: Basic (username, password,domain)

thanxs in advance.

Regards Jorrit

Verified Answer
  • This has been followed through the Support Case:

    The main reason for getting 401 error :- Service(Consumer) is expecting a SOAP message which is to be sent through the "Request Body" as raw data.

    As on date Rollbase do not have any API which will take input as request body as raw data. Currenly rollbase has two API's which are used for sending POST requests

    1)rbv_api.sendHttpPost-This works fine when there is no request body.
    2)rbv_api.sendJSONRequest- This works fine when the request body is been consumer accepts only "application/json" types.

    A defect #41365 has been logged for enhancing existing rbv_api.sendHttpPost API to accept one more parameter.

    However the request body can still be sent as a raw data using java classes which could exposed to Rollbase javascript.(Applicable only for Private cloud)

    Below are the steps for sending HTTP POST request with request body.

    1)Add below packages to CustomerClassFilter in shared.properties as below.
    CustomClassFilter=(java.net.*)|(java.lang.*)|(java.io.*)|(sun.net.www.protocol.*)|(javax.xml.namespace.*)|(javax.xml.ws.*)|(org.apache.http.*) |(sun.net.www.http.*)

    2)Create an object script trigger and copy the below code.(The following code sample assumes request body as "SOAP Message" of type "text/xml")

    var obj=new Packages.java.net.URL("localhost:9999/.../hello"); //URI of the deployed service
    var con=(obj.openConnection());
    con.setDoOutput(true);
    con.setRequestMethod("POST");
    con.setRequestProperty("Username", "shiva");
    con.setRequestProperty("Password", "password");
    con.setRequestProperty("Content-Type", "text/xml");
    var os=con.getOutputStream();//Opening output stream since SOAP message needs to be sent as request body as a raw data.
    var input="<soapenv:Envelope xmlns:soapenv=\"schemas.xmlsoap.org/.../\" xmlns:ws=\"ws.test.com/.../soapenv:Envelope>";
    var utf8 = {};
    utf8.toByteArray = function(str) { //This function converts String to byte array
    var byteArray = [];
    for (var i = 0; i < str.length; i++)
    if (str.charCodeAt(i) <= 0x7F)
    byteArray.push(str.charCodeAt(i));
    else {
    var h = encodeURIComponent(str.charAt(i)).substr(1).split('%');
    for (var j = 0; j < h.length; j++)
    byteArray.push(parseInt(h[j], 16));
    }
    return byteArray;
    };
    os.write(utf8.toByteArray(input));//Converting String to array of bytes since write method accepts only array of bytes.
    os.flush();
    var responseCode = con.getResponseCode();//Optional variable to check if response is ok or failed.
    rbv_api.println(responseCode);
    var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(con.getInputStream()));
    var output;
    while((output=br.readLine())!=null){
    rbv_api.println(output);
    }

    Regards,

    Shiva

All Replies
  • Hi,

    Are you looking for similar information :

    community.progress.com/.../17539

    -Mani.

  • Hi Many,

    Even with the information in de post you send me i still cant connect to the webservice.

    Can you please help me?

    The admnistrator of the website send me how they connect to te webservice in .net C# see image attached:

    This is my code used from the post above:

    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    function encode64(input) {
    input = escape(input);
    var output = "";
    var chr1, chr2, chr3 = "";
    var enc1, enc2, enc3, enc4 = "";
    var i = 0;
    do {
    chr1 = input.charCodeAt(i++);
    chr2 = input.charCodeAt(i++);
    chr3 = input.charCodeAt(i++);

    enc1 = chr1 >> 2;
    enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
    enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
    enc4 = chr3 & 63;
    if (isNaN(chr2)) {
    enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
    enc4 = 64;
    }
    output = output +
    keyStr.charAt(enc1) +
    keyStr.charAt(enc2) +
    keyStr.charAt(enc3) +
    keyStr.charAt(enc4);
    chr1 = chr2 = chr3 = "";
    enc1 = enc2 = enc3 = enc4 = "";
    } while (i < input.length);
    return output;
    }

    var username = 'domain\username';
    var password = 'password';


    var siteAuth = username + ":" + password;

    var encodedSiteAuth = encode64(siteAuth);

    //rbv_api.println(encodedSiteAuth);

    var url = "webservice_URL.....";


    var header = { "Authorization” : “Basic " : encodedSiteAuth};
    //rbv_api.println(header);

    var data = null;

    var method = "POST";
    var contentType = "application/xml; charset=UTF-8";

    var request = rbv_api.sendJSONRequest(url, data, method, contentType, username, password, null);
    //rbv_api.println(request);

    When i debug the code i still get the error:

    HTTP Error 401: HTTP call failed: Unauthorized (line #64)

    Thanks in advance,

    Regards Jorrit

  • Hi Mani or anyone,

    i still got the problem connecting to a webservice.

    regards Jorrit

  • Anyone?

  • Hi Mani,

    can you please help me with my problem?

    regards Jorrit

  • Anybody?

  • Hi Jorrit,

    Can you try sending from a generic REST client like POSTMAN and post raw request (password masked) for a success run ?

    Regards,

    Shiva

  • Also, in your code can you please specify the method as ""GET" instead of "POST" ?

  • Hi Shiva, i already tried to set "GET".

    In postman i get the next result:

    Www-Authenticate: Negotiate; NTLM

    so with basic authentication i cant connect to the service.

    Is there any way to connect via NTLM?

    thanks for your time and response.

    Regards Jorrit

  • Hi Jorrit,

    Can you please open a support ticket ? this needs a little investigation.

    Regards,Shiva

  • This has been followed through the Support Case:

    The main reason for getting 401 error :- Service(Consumer) is expecting a SOAP message which is to be sent through the "Request Body" as raw data.

    As on date Rollbase do not have any API which will take input as request body as raw data. Currenly rollbase has two API's which are used for sending POST requests

    1)rbv_api.sendHttpPost-This works fine when there is no request body.
    2)rbv_api.sendJSONRequest- This works fine when the request body is been consumer accepts only "application/json" types.

    A defect #41365 has been logged for enhancing existing rbv_api.sendHttpPost API to accept one more parameter.

    However the request body can still be sent as a raw data using java classes which could exposed to Rollbase javascript.(Applicable only for Private cloud)

    Below are the steps for sending HTTP POST request with request body.

    1)Add below packages to CustomerClassFilter in shared.properties as below.
    CustomClassFilter=(java.net.*)|(java.lang.*)|(java.io.*)|(sun.net.www.protocol.*)|(javax.xml.namespace.*)|(javax.xml.ws.*)|(org.apache.http.*) |(sun.net.www.http.*)

    2)Create an object script trigger and copy the below code.(The following code sample assumes request body as "SOAP Message" of type "text/xml")

    var obj=new Packages.java.net.URL("localhost:9999/.../hello"); //URI of the deployed service
    var con=(obj.openConnection());
    con.setDoOutput(true);
    con.setRequestMethod("POST");
    con.setRequestProperty("Username", "shiva");
    con.setRequestProperty("Password", "password");
    con.setRequestProperty("Content-Type", "text/xml");
    var os=con.getOutputStream();//Opening output stream since SOAP message needs to be sent as request body as a raw data.
    var input="<soapenv:Envelope xmlns:soapenv=\"schemas.xmlsoap.org/.../\" xmlns:ws=\"ws.test.com/.../soapenv:Envelope>";
    var utf8 = {};
    utf8.toByteArray = function(str) { //This function converts String to byte array
    var byteArray = [];
    for (var i = 0; i < str.length; i++)
    if (str.charCodeAt(i) <= 0x7F)
    byteArray.push(str.charCodeAt(i));
    else {
    var h = encodeURIComponent(str.charAt(i)).substr(1).split('%');
    for (var j = 0; j < h.length; j++)
    byteArray.push(parseInt(h[j], 16));
    }
    return byteArray;
    };
    os.write(utf8.toByteArray(input));//Converting String to array of bytes since write method accepts only array of bytes.
    os.flush();
    var responseCode = con.getResponseCode();//Optional variable to check if response is ok or failed.
    rbv_api.println(responseCode);
    var br=new Packages.java.io.BufferedReader(new Packages.java.io.InputStreamReader(con.getInputStream()));
    var output;
    while((output=br.readLine())!=null){
    rbv_api.println(output);
    }

    Regards,

    Shiva

  • Hi Shiva,

    Its working!!

    Thank you for your time and support!

    Regards Jorrit

  • Hi Shiva,

    The code above sometimes gives a error:

    Error Cannot convert org.mozilla.javascript.NativeArray@71054893 to byte[]

    Do you have any idea what this error contains?

    Regards Jorrit

  • Hi Jorrit,

    Replace var utf8 = {}; with below line

    var utf8 = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 8142);

    Please let me know the results.

    Regards,

    Shiva