components_tasks_PostTask.bs
import "pkg:/source/api/baserequest.bs"
import "pkg:/source/utils/misc.bs"
sub init()
m.top.functionName = "postItems"
end sub
' Main function for PostTask.
' Posts either an array of data
' or a string of data to an API endpoint.
' Saves the response information
sub postItems()
if m.top.apiUrl = ""
print "ERROR in PostTask. Invalid API URL provided"
return
end if
if m.global.session.server.url = ""
print "ERROR in PostTask. No server URL set in session"
m.top.responseCode = -1
m.top.failureReason = "No server URL set in session"
return
end if
if m.top.arrayData.count() > 0 and m.top.stringData = ""
print "PostTask Started - Posting array to " + m.top.apiUrl
req = APIRequest(m.top.apiUrl)
if not isValid(req)
print "ERROR in PostTask. Failed to create API request for " + m.top.apiUrl
m.top.responseCode = -1
m.top.failureReason = "Failed to create API request"
return
end if
req.SetRequest("POST")
httpResponse = asyncPost(req, FormatJson(m.top.arrayData))
m.top.responseCode = httpResponse
print "PostTask Finished. " + m.top.apiUrl + " Response = " + httpResponse.toStr()
else if m.top.arrayData.count() = 0 and m.top.stringData <> ""
print "PostTask Started - Posting string(" + m.top.stringData + ") to " + m.top.apiUrl
req = APIRequest(m.top.apiUrl)
if not isValid(req)
print "ERROR in PostTask. Failed to create API request for " + m.top.apiUrl
m.top.responseCode = -1
m.top.failureReason = "Failed to create API request"
return
end if
req.SetRequest("POST")
httpResponse = asyncPost(req, m.top.stringData)
m.top.responseCode = httpResponse
print "PostTask Finished. " + m.top.apiUrl + " Response = " + httpResponse.toStr()
else
print "ERROR processing data for PostTask"
end if
end sub
' Post data and wait for response code
function asyncPost(req, data = "" as string) as integer
' response code 0 means there was an error
respCode = 0
req.setMessagePort(CreateObject("roMessagePort"))
req.AddHeader("Content-Type", "application/json")
req.AsyncPostFromString(data)
' wait up to m.top.timeoutSeconds for a response
' NOTE: wait() uses milliseconds - multiply by 1000 to convert
resp = wait(m.top.timeoutSeconds * 1000, req.GetMessagePort())
' Check if we got a valid response
if type(resp) <> "roUrlEvent"
print "ERROR in asyncPost: Did not receive roUrlEvent, got: " + type(resp)
m.top.failureReason = "Network request timeout or invalid response type"
return -1
end if
respString = resp.GetString()
if isValidAndNotEmpty(respString)
m.top.responseBody = ParseJson(respString)
print "m.top.responseBody=", m.top.responseBody
end if
respCode = resp.GetResponseCode()
if respCode < 0
' there was an unexpected error
m.top.failureReason = resp.GetFailureReason()
print "ERROR in asyncPost: HTTP error code " + respCode.toStr() + ", reason: " + m.top.failureReason
else if respCode >= 200 and respCode < 300
' save response headers if they're available
m.top.responseHeaders = resp.GetResponseHeaders()
else
' HTTP error response
m.top.failureReason = "HTTP error: " + respCode.toStr()
print "ERROR in asyncPost: HTTP error " + respCode.toStr()
end if
return respCode
end function
' Revert PostTask to default state
sub empty()
' These should match the defaults set in PostTask.xml
m.top.apiUrl = ""
m.top.timeoutSeconds = 30
m.top.arrayData = {}
m.top.stringData = ""
m.top.responseCode = invalid
m.top.responseBody = {}
m.top.responseHeaders = {}
m.top.failureReason = ""
end sub