NetTalk Central
The Rest Of NetTalk => The Rest - Ask For Help => Topic started by: Rene Simons on January 26, 2020, 08:54:19 AM
-
Hi all,
I have acces to an API where I can obtain inof I need for my web-application.
To use it I need to set the HTTP-headers. The specs for the header can be seen in the attached image.
I have no idea on how to set these headers.
I guess I can call the URL after I set the HTTP-headers.
And then retrieve the received result in the Pagereceived embed.
Thanks in advance for helping me out here.
René
-
I've found it useful to experiment with the web client in the basic NetTalk demo program to get bits of communication going with an external API, then copying that code into my own app.
FWIW, here's some code I use for API calls to one service:
ThisWebClient.SetAllHeadersDefault()
ThisWebClient.HeaderOnly = 0
ThisWebClient.Cookie = ''
ThisWebClient.CustomHeader = 'Authorization: Bearer '&clip(pToken)
ThisWebClient.Referer = ''
ThisWebClient.AsyncOpenTimeOut = 2200 ! 22 seconds
ThisWebClient.InActiveTimeout = GLO:QueryTimeout ! 6000
ThisWebClient.SSLMethod = NET:SSLMethodTLS
ThisWebClient.HTTPVersion = 'HTTP/1.1'
ThisWebClient.ContentType = 'application/x-www-form-urlencoded'
ThisWebClient.ConnectionKeepAlive = FALSE
ThisWebClient.CanUseProxy = GLO:CanUseProxy
ThisWebClient.Fetch(clip(pURL))
and this is the POST to the same service to get its bearer oauth token:
ThisWebClient.SetAllHeadersDefault()
ThisWebClient.HeaderOnly = 0
ThisWebClient.Cookie = ''
ThisWebClient.CustomHeader = ''
ThisWebClient.Referer = ''
ThisWebClient.Authorization = ThisWebClient.CreateAuthorizationString (LOC:Key, LOC:Secret, Net:WebBasicAuthentication,_AuthNoWrap)
ThisWebClient.AsyncOpenTimeOut = 1200 ! 12 seconds
ThisWebClient.InActiveTimeout = 2000 ! 20 seconds
ThisWebClient.SSLMethod = NET:SSLMethodTLS
ThisWebClient.HTTPVersion = 'HTTP/1.1'
ThisWebClient.ContentType = 'application/x-www-form-urlencoded'
ThisWebClient.ConnectionKeepAlive = FALSE
ThisWebClient.CanUseProxy = GLO:CanUseProxy
ThisWebClient.Post(LOC:URL,clip(LOC:PostString))
-
Thank you Jane.
That actually helped a lot.
-
Hi Rene,
shout if you need more. There are various properties you can set (which turn into headers) and also a CustomHeader property you can set as well.
cheers
Bruce
-
Bruce,
With the tips Jane gave, I managed to to use a third party api and retrieve the json data I need.
Structurewise, the json varies from time to time so I have to figure out how I am going to retrieve the data.
But since you are asking :-) ...
I do a ThisWebClient.fetch to get the data.
Is there any simple or not so hard way I can put the result in a StringTheory object so I can manipulate things?
Cheers,
René
-
I've only done one significant API project, Rene, so my experience is limited. But this one has been working fine for a year and a half and FWIW, this is the approach I took.
Other than getting the bearer token, my other interactions involve a ThisWebClient.Fetch method.
I've packaged that method in a separate Window procedure (SendGetPacket), and each of the data items I'm calling uses that procedure.
The prototype for SendGetPacket is (STRING pURL, STRING pToken,StringTheory pST),LONG
The URL is built by the calling procedure to have exactly what is needed for this particular fetch. The token is... um... the bearer token. And the StringTheory object is what will receive the data in the calling procedure.
On EVENT:OpenWindow, SendGetPacket runs the Fetch code I pasted in my earlier message.
There's the ErrorTrap code copied directly from Bruce's example.
There's no doubt a better way to do the next bit, but I wrote something that worked and haven't bothered trying to improve that. SendGetPacket has its own StringTheory object (ST1) which I just use to make sure there's a '200' success response in what I've received. LOC:RV is the LONG for the prototype's return.
In the ThisWebClient,PageReceived, after the parent, I have this code to remove the header and to put the body of what was received into the StringTheory object passed by the calling procedure:
st1.SetValue(ThisWebClient.ThisPage.GetValue())
ST1.split('<13>')
LOC:ResultLine = ST1.GetLine(1)
if Instring('200',LOC:ResultLine,1,1)
LOC:RV = TRUE
self.RemoveHeader()
pST.SetValue(ThisWebClient.ThisPage.GetValue())
ELSE
LOC:RV = FALSE
if Instring('ERROR',upper(LOC:ResultLine),1,1)
AddErrorLog(LOC:ResultLine)
loop ERR# = 1 to ST1.Records()
if instring('detailedm',ST1.GetLine(ERR#) ,1,1)
AddErrorLog(ST1.GetLine(ERR#))
BREAK
end ! if
end ! loop
end ! if
end ! if
post(event:closewindow)
The procedures calling this are also Window procedures, and I have one of them customized for each data item I'm receiving (doctors, patient appointments, service locations, etc.)
The "Web" object below is a simple class I wrote derived from StringTheory to built the parameter string URLs for the API calls.
As you can see, I basically prepare the URL, call my ClientSendPacket and pass it that URL and my calling StringTheory object.
Then load the contents of the StringTheory object into a jfiles object and do whatever processing after that.
ST.start()
web.ClearParms()
web.SetBaseURL(clip(GLO:PracticeID)&'/departments' )
web.AddParm('showalldepartments='&choose(pShowAllDepts,'true','false') )
web.AddParm('providerlist='&choose(pProviderList,'true','false') )
ClientSendPacket(web.GetURL(),ST)
JsonData.Start
JsonData.SetTagCase(jf:CaseAny)
JSONData.Load(ST)
HTH
Cheers,
Jane
-
Hi Rene,
>> I do a ThisWebClient.fetch to get the data.
>> Is there any simple or not so hard way I can put the result in a StringTheory object so I can manipulate things?
To summarize Jane's post somewhat - it's already in a StringTheory object.
The result returns in the PageReceived method, in self.thispage - which is a StringTheory object.
cheers
Bruce
-
Bruce,
Thanks again.
Jane's additional information made things a lot clearer and also gave me some things to think about.
Thanks to Jane as well.
Cheers,
Rene