Page 3 of 3
Re: Communication via HTTP with SOAP
Posted: Tue Jul 24, 2018 12:04 pm
by edk
Hi Steed.
Based on the WSDL schema, I prepared a SOAP query.
Unfortunately, I get information that the connection is being refused.
Log from SoapUI:
Code: Select all
Error getting response for [TCRMServicesWebServiceSoapBinding.queryTCRM:Request 1]; org.apache.http.conn.HttpHostConnectException: Connection to http://superfinanciera.gov.co:8080 refused
This may be related to, for example, blocking requests from domains other than .co or authorization is required.
No additional hints in the WSDL scheme.
Do you have any documentation for this WEB Service in English?
Re: Communication via HTTP with SOAP
Posted: Tue Jul 24, 2018 9:01 pm
by Steed
Thanks a lot, Edk
It looks to work fine, changing line 121 (taking off the :8080)
Local TCRMUrl := "http://superfinanciera.gov.co:
8080/SuperfinancieraWebServiceTRM/TCRMServicesWebService/TCRMServicesWebService"
by
Local TCRMUrl := "http://superfinanciera.gov.co
/SuperfinancieraWebServiceTRM/TCRMServicesWebService/TCRMServicesWebService"
- Captura.JPG (32.92 KiB) Viewed 3246 times
But how to save only the data highlighted in Yellow ?,
Thanks again,
ES
Re: Communication via HTTP with SOAP
Posted: Tue Jul 24, 2018 10:00 pm
by edk
Steed
Indeed.
I don't understand why in the definition wsdl say:
Code: Select all
<soap: address location = "http://superfinanciera.gov.co:8080/SuperfinancieraWebServiceTRM/TCRMServicesWebService/TCRMServicesWebService" />
Very strange.
∞ X
Re: Communication via HTTP with SOAP
Posted: Tue Jul 24, 2018 10:21 pm
by edk
Steed wrote: ↑Tue Jul 24, 2018 9:01 pm
But how to save only the data highlighted in Yellow ?,
Thanks again,
ES
Eduar, try this:
Code: Select all
#include "hmg.ch"
Function Main()
SET CENTURY ON
SET LANGUAGE TO SPANISH
SET NAVIGATION EXTENDED
DEFINE WINDOW TCRMForm AT 0 , 0 WIDTH 270 HEIGHT 200 TITLE 'TCRMServicesWebService' MAIN;
NOMINIMIZE;
NOMAXIMIZE;
NOSIZE
DEFINE LABEL Label_1
ROW 30
COL 40
WIDTH 120
HEIGHT 20
VALUE "Associated Date"
ALIGNMENT Right
END LABEL
DEFINE DATEPICKER dDate
ROW 55
COL 70
WIDTH 120
HEIGHT 24
VALUE DATE()
END DATEPICKER
DEFINE BUTTON Button_1
ROW 100
COL 80
WIDTH 100
HEIGHT 28
ACTION TCRMApi(TCRMForm.dDate.Value)
CAPTION "Query"
END BUTTON
DEFINE STATUSBAR FONT "MS Shell Dlg" SIZE 7
STATUSITEM HMGVersion()
CLOCK
END STATUSBAR
ON KEY ESCAPE ACTION ThisWindow.Release
END WINDOW
CENTER WINDOW TCRMForm
ACTIVATE WINDOW TCRMForm
Return Nil
****************************************************************************************
Function TCRMApi( dDate )
Local RespHttp, oHttp, SOAP_Form, cResp
TCRMForm.Button_1.Enabled := .F.
IF !isInternet()
MsgExclamation("No Internet connection.", "Warning")
TCRMForm.Button_1.Enabled := .T.
RETURN
ENDIF
info_('Initializing...')
//Init
oHttp := TCRM_api_init()
IF EMPTY(oHttp)
Info_("Error while initialization MSXML",.T.)
WAIT CLEAR
TCRMForm.Button_1.Enabled := .T.
ENDIF
info_('Quering...')
SOAP_Form := '<tcrmQueryAssociatedDate>' + SOAPDate( dDate ) + '</tcrmQueryAssociatedDate>'
RespHttp := TCRM_api_Execute( oHttp , Envelope( SOAP_Form ) )
IF EMPTY(RespHttp)
info_('No data',.T.)
WAIT CLEAR
ELSE
WAIT CLEAR
cResp := 'id: ' + GetFromXml ( 'id', RespHttp ) + CRLF
cResp += 'unit: ' + GetFromXml ( 'unit', RespHttp ) + CRLF
cResp += 'validityFrom: ' + GetFromXml ( 'validityFrom', RespHttp ) + CRLF
cResp += 'validityTo: ' + GetFromXml ( 'validityTo', RespHttp ) + CRLF
cResp += 'value: ' + GetFromXml ( 'value', RespHttp ) + CRLF
cResp += 'success: ' + GetFromXml ( 'success', RespHttp )
MsgInfo( cResp, 'Response' )
ENDIF
TCRM_api_close( oHttp )
TCRMForm.Button_1.Enabled := .T.
RETURN
*****************************************************************************************
Function SOAPDate( dDate )
RETURN NTOC(YEAR(dDate),10,4,'0') + '-' + NTOC(MONTH(dDate),10,2,'0') + '-' + NTOC(DAY(dDate),10,2,'0')
*****************************************************************************************
Function TCRM_api_init()
Local oHttp := ""
BEGIN SEQUENCE WITH {|o| break(o)}
oHttp := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
RECOVER USING oErr
MsgStop(hb_StrToUTF8(oErr:Description) ,"Error Microsoft XML Core Services (MSXML)" )
oHttp := ""
END SEQUENCE
RETURN oHttp
******************************************************************************************
Function TCRM_api_close( oHttp )
IF !EMPTY(oHttp)
oHttp:Abort()
ENDIF
RETURN
******************************************************************************************
Function TCRM_api_Execute( oHttp , cXml )
Local TCRM_recv := ""
//Local TCRMUrl := "http://superfinanciera.gov.co:8080/SuperfinancieraWebServiceTRM/TCRMServicesWebService/TCRMServicesWebService"
Local TCRMUrl := "http://superfinanciera.gov.co/SuperfinancieraWebServiceTRM/TCRMServicesWebService/TCRMServicesWebService"
IF !EMPTY( oHttp )
BEGIN SEQUENCE WITH {|o| break(o)}
ohttp:Open( "POST", TCRMUrl, .F. )
ohttp:setRequestHeader("Accept-Encoding", "gzip,deflate")
ohttp:setRequestHeader("Content-Type", "text/xml;charset=UTF-8")
ohttp:Send( cXml )
TCRM_recv := ohttp:ResponseBody()
RECOVER USING oErr
TCRM_recv := ""
MsgStop(hb_StrToUTF8(oErr:Description) , "Error" )
END SEQUENCE
ENDIF
RETURN TCRM_recv
************************************************
Function Envelope( cParameter )
Local cXml := ''
Local cUrlTCRM := "http://action.trm.services.generic.action.superfinanciera.nexura.sc.com.co/"
Local sEnvelO := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:act="' + cUrlTCRM + '">' + CRLF
Local sHeadO := '<soapenv:Header>' + CRLF
Local sHeadC := '</soapenv:Header>' + CRLF
Local sBodyO := '<soapenv:Body>' + CRLF
Local sBodyC := '</soapenv:Body>' + CRLF
Local sQueryO := '<act:queryTCRM>' + CRLF
Local sQueryC := '</act:queryTCRM>' + CRLF
Local sEnvelC := '</soapenv:Envelope>' + CRLF
cXml := sEnvelO
cXml += sHeadO
cXml += sHeadC
cXml += sBodyO
cXml += sQueryO
cXml += cParameter+CRLF
cXml += sQueryC
cXml += sBodyC
cXml += sEnvelC
//msgbox(cXml, 'SOAP Envelope')
RETURN cXml
*****************************************
Function info_(cMessage, lWait)
Local nTimeIni := hb_MilliSeconds()
Default lWait := .F.
Wait Window cMessage NoWait
IF lWait
WHILE( ( hb_MilliSeconds() - nTimeIni ) < 3 * 1000 )
DO EVENTS
hb_releaseCPU()
ENDDO
ENDIF
RETURN Nil
*********************************
FUNCTION isInternet( nTimeOut )
Local aAddr:=hb_socketResolveINetAddr( "www.google.com" , 80 )
Local socket:=hb_socketOpen()
Local lIsNet
Default nTimeOut := 2000
lIsNet := !EMPTY( aAddr ) .AND. hb_socketConnect( socket , aAddr, nTimeOut )
hb_socketClose( socket )
RETURN lIsNet
*********************************
FUNCTION GetFromXml ( cTag, cXml )
Local cTagOpen :="<" + cTag + ">"
Local cTagClose := "</" + cTag + ">"
Local nPosTagOpen := AT ( cTagOpen, cXml )
Local nPosTagClose := AT ( cTagClose, cXml )
Local xValue := ""
IF nPosTagOpen > 0 .AND. nPosTagOpen < nPosTagClose
xValue := SUBSTR( cXml, nPosTagOpen + LEN( cTagOpen ), nPosTagClose - ( nPosTagOpen + LEN( cTagOpen ) ) )
ENDIF
RETURN xValue
Edward.
Re: Communication via HTTP with SOAP
Posted: Tue Jul 24, 2018 11:14 pm
by Steed
Thanks a lot again Edk, It works like a charm
- Captura2.JPG (15.98 KiB) Viewed 3227 times
Re: Communication via HTTP with SOAP
Posted: Wed Jul 25, 2018 9:22 am
by nekbmm
Hi, i need some help with SOAP also
https://webservices.nbs.rs/Communicatio ... .asmx?WSDL
How do i forward AuthenticationHeader for this service?
nekbmm
Re: Communication via HTTP with SOAP
Posted: Wed Jul 25, 2018 12:45 pm
by edk
Hi.
For example: GetCurrentExchangeRate request, SOAP Envelope should be:
Code: Select all
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://communicationoffice.nbs.rs">
<soapenv:Header>
<com:AuthenticationHeader>
<!--Optional:-->
<com:UserName>?</com:UserName>
<!--Optional:-->
<com:Password>?</com:Password>
<com:LicenceID>?</com:LicenceID>
</com:AuthenticationHeader>
</soapenv:Header>
<soapenv:Body>
<com:GetCurrentExchangeRate>
<com:exchangeRateListTypeID>?</com:exchangeRateListTypeID>
</com:GetCurrentExchangeRate>
</soapenv:Body>
</soapenv:Envelope>
"LicenceID" and "exchangeRateListTypeID" is required.
POST should be sent to:
https://webservices.nbs.rs/Communicatio ... rvice.asmx
POST Headers:
Code: Select all
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://communicationoffice.nbs.rs/GetCurrentExchangeRate"
Host: webservices.nbs.rs
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
For example: GetServiceVersion request, SOAP Envelope should be:
Code: Select all
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:com="http://communicationoffice.nbs.rs">
<soapenv:Header>
<com:AuthenticationHeader>
<!--Optional:-->
<com:UserName>?</com:UserName>
<!--Optional:-->
<com:Password>?</com:Password>
<com:LicenceID>?</com:LicenceID>
</com:AuthenticationHeader>
</soapenv:Header>
<soapenv:Body>
<com:GetServiceVersion/>
</soapenv:Body>
</soapenv:Envelope>
"LicenceID" is required.
POST should be sent to:
https://webservices.nbs.rs/Communicatio ... rvice.asmx
POST Headers:
Code: Select all
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://communicationoffice.nbs.rs/GetServiceVersion"
Host: webservices.nbs.rs
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Pay attention to SOAPAction. It is based on which request you want to use.
You handle the other requests similarly.
Re: Communication via HTTP with SOAP
Posted: Wed Jul 25, 2018 4:18 pm
by nekbmm
Thanks EDK i'll try it.
Re: Communication via HTTP with SOAP
Posted: Thu Jul 26, 2018 5:59 pm
by nekbmm
EDK,
Web service works fine now. However this part wasn't optional for our web service.
<!--Optional:-->
<com:UserName>?</com:UserName>
<!--Optional:-->
<com:Password>?</com:Password>
Br
Re: Communication via HTTP with SOAP
Posted: Thu Jul 26, 2018 6:27 pm
by edk
The wsdl say: "minoccurs = 0", which means that the parameter does not have to occur, which is why SoapUI reports it as optional.
It's nice that it works properly.