Wednesday, 18 January 2017

Calling webservices from OAF Page

We can call webservices directly from OAF Page. Or we can call webservices from SQL procedure and invoke that procedure from our OAF Page.
Here we are calling webservices from Oracle procedure and calling that procedure from OAF Page.

SQL Procedure:
-----------------

create or replace PROCEDURE invoke_soaservice_p(
    ARG0 IN VARCHAR2 , --
    ARG1 IN VARCHAR2 ,--
    ARG2 IN VARCHAR2 , --
    ARG3 IN VARCHAR2 , --
    ARG4 IN VARCHAR2 , --
    arg5 IN VARCHAR2 , -- Remarks
    result OUT VARCHAR2)
AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  --//===========================================================================
  --Variable declaration
  --//===========================================================================
  --lv_org_id             VARCHAR2(255) := FND_PROFILE.VALUE('ORG_ID');
  lv_soap_request VARCHAR2(30000);
  lv_soap_respond VARCHAR2(30000);
  lv_soap_request_xml XMLTYPE;
  http_req UTL_HTTP.REQ;
  http_resp UTL_HTTP.RESP;
  l_return VARCHAR2(30000);


  vErrorCode    VARCHAR2(100);
  vErrorMessage VARCHAR2(500);
  vXml Xmltype;

'http://10.127.9.14:8080/emas2/services/authenticateWS?wsdl';
  p_soawsdl         VARCHAR2(500) := 'WADL_LINK'; --WSDL Link
  pn_datetime       VARCHAR2(200);
  lv_user_id        VARCHAR2(250);
  lv_passwd         VARCHAR2(250);
  l_url             VARCHAR2(250):= 'null';
  l_id              NUMBER;
  lv_dms_bse_path   VARCHAR2(240);
  lv_dms_department VARCHAR2(240);
BEGIN
  dbms_output.enable(1000000);

  SELECT TO_CHAR(sysdate,'DD-MON-YYYY HH:RR:MM') INTO pn_datetime FROM dual;


  /*--------------  Invoke Register webservice to register the user----------------- */
  lv_soap_request:= '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ds="http://ds.ws.emas/">
<soapenv:Header/>
<soapenv:Body>
<ds:WEBSERVICE_NAME>
<arg0>'||arg0||'</arg0>   //pass parameters to webservice
<arg1>'||arg1||'</arg1>
<arg2>'||arg2||'</arg2>
<arg3>'||arg3||'</arg3>
<arg4>'||arg4||'</arg4>
<arg5>'||arg5||'</arg5>
<arg6>true</arg6>
</ds:WEBSERVICE_NAME>
</soapenv:Body>
</soapenv:Envelope>';

  SELECT TO_CHAR(sysdate,'DD-MON-YYYY HH:RR:MM') INTO pn_datetime FROM dual;
 
  --//===========================================================================
  --Creating the request
  --//===========================================================================
  http_req:= UTL_HTTP.begin_request(p_soawsdl , 'POST' , 'HTTP/1.0');

  SELECT TO_CHAR(sysdate,'DD-MON-YYYY HH:RR:MM') INTO pn_datetime FROM dual;
  --dbms_output.put_line('After Calling http '||pn_datetime);
  --//===========================================================================
  -- since we are dealing with plain text in XML documents
  --//===========================================================================
  UTL_HTTP.set_header(http_req, 'Content-Type', 'text/xml');
  UTL_HTTP.set_header(http_req, 'Content-Length', LENGTH(lv_soap_request));
  --//===========================================================================
  -- required to specify this is a SOAP communication
  --//===========================================================================
  UTL_HTTP.set_header(http_req, 'SOAPAction', 'process');
  UTL_HTTP.write_text(http_req, lv_soap_request);
  SELECT TO_CHAR(sysdate,'DD-MON-YYYY HH:RR:MM') INTO pn_datetime FROM dual;
  -- dbms_output.put_line('After SOAP Process '||pn_datetime);
  --//===========================================================================
  --If the web service is syncronous then it will wait for the response
  --//===========================================================================

  http_resp := UTL_HTTP.GET_RESPONSE(http_req);
  UTL_HTTP.READ_TEXT(http_resp, lv_soap_respond);
  UTL_HTTP.END_RESPONSE(http_resp);
  lv_soap_request_xml:= xmltype(lv_soap_respond);  //webservice will return result in SOAP response format

  /*------------------  Remove SOAP headers and get the Result value------------- */
  SELECT extractValue(lv_soap_request_xml, '//return', ' xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://ds.ws.emas/"') RETURN
  INTO l_return
  FROM DUAL;  //use extractValue method to extract output from SOAP response


  result := l_return; //Assign result to variable

  COMMIT;

  SELECT TO_CHAR(SYSDATE,'DD-MON-YYYY HH:RR:MM')
  INTO pn_datetime
  FROM dual;

EXCEPTION
WHEN UTL_HTTP.end_of_body THEN
  UTL_HTTP.END_RESPONSE(http_resp);
  -- errbuf := 'Call to webservice Completed Successfully';
  -- retcode := 0 ;
WHEN UTL_HTTP.request_failed THEN
  dbms_output.put_line('Request Failed:' ||UTL_HTTP.GET_DETAILED_SQLERRM);
  -- errbuf := 'EXCEPTION :UTL_HTTP.request_failed';
  -- retcode := 2 ;
WHEN UTL_HTTP.http_server_error THEN
  dbms_output.put_line('Server Error:'||UTL_HTTP.GET_DETAILED_SQLERRM);
  -- errbuf := 'EXCEPTION :UTL_HTTP.http_server_error';
  -- retcode := 2 ;
WHEN UTL_HTTP.http_client_error THEN
  dbms_output.put_line('Client Error:'||UTL_HTTP.GET_DETAILED_SQLERRM);
  /* errbuf := 'EXCEPTION:UTL_HTTP.http_client_error';
  retcode := 2 ;*/
WHEN OTHERS THEN
  dbms_output.put_line(SUBSTR(SQLERRM,1,255));
  /*  errbuf := 'EXCEPTION :Others';
  retcode := 2 ;*/
END Invoke_soaservice_p;

Call this procedure using CallableStatement In OADBTransaction class in OAF.


No comments:

Post a Comment