I am trying to convert the Base64 string received from the API, into a usable path for the image. The image will then be displayed in a Poster node. Here's what I have done so far:
Task.brs:
xfer = CreateObject("roURLTransfer")
xfer.SetCertificatesFile("common:/certs/ca-bundle.crt")
xfer.SetURL("https://api.api-ninjas.com/v1/qrcode?data=" + link + "&format=png")
xfer.addHeader("X-Api-Key", "my-key")
xfer.InitClientCertificates()
rsp = xfer.GetToString()
ba = CreateObject("roByteArray")
ba.FromBase64String(rsp)
WriteAsciiFile("tmp:/poster.txt", ba.ToAsciiString())
print "Decoded (?):" ba
file = ReadAsciiFile("tmp:/poster.txt")
uri = file
m.top.uri = uri
This is the response I get:
*** ERROR: Invalid path: '?PNG
?
'
*** ERROR: Invalid path: '?PNG
?
'
What am I doing wrong?
I tried it, but that didn't work. But I figured out what I was doing wrong.
What I did now:
This worked, here's the refactored code:
// fetching data from API
xfer = CreateObject("roURLTransfer")
xfer.SetCertificatesFile("common:/certs/ca-bundle.crt")
xfer.SetURL("https://api.api-ninjas.com/v1/qrcode?data=" + link + "&format=png")
xfer.addHeader("X-Api-Key", "my-key")
xfer.InitClientCertificates()
rsp = xfer.GetToString()
// Conversion from Base64
uri = "tmp:/poster.png" //the path
ba = CreateObject("roByteArray")
ba.fromBase64String(rsp)
ba.writeFile(uri)
m.top.uri = uri // setting the path
Hope this helps someone in the future!
Based on the API url, it looks like it can return PNGs, so why not use xfer.AsyncGetToFile() instead of xfer.GetToString() and skip all the conversions you have?
Another potential solution is skipping the task approach altogether, and just using Poster node. Something along the lines of
1. Create roHttpAgent
2. Use AddHeader() on the http agent to add your X-Api-Key header to it
3. Create Poster node
4. Use SetHttpAgent() on the Poster node to set the roHttpAgent from step 1 to the Poster node
5. Set Poster node uri field to your API url with the target link
(Poster nodes might have an httpAgent by default, not too sure, in which case you can reduce the number of steps above)
I tried it, but that didn't work. But I figured out what I was doing wrong.
What I did now:
This worked, here's the refactored code:
// fetching data from API
xfer = CreateObject("roURLTransfer")
xfer.SetCertificatesFile("common:/certs/ca-bundle.crt")
xfer.SetURL("https://api.api-ninjas.com/v1/qrcode?data=" + link + "&format=png")
xfer.addHeader("X-Api-Key", "my-key")
xfer.InitClientCertificates()
rsp = xfer.GetToString()
// Conversion from Base64
uri = "tmp:/poster.png" //the path
ba = CreateObject("roByteArray")
ba.fromBase64String(rsp)
ba.writeFile(uri)
m.top.uri = uri // setting the path
Hope this helps someone in the future!