DataFlex Requires Chilkat v11.7.0+
DataFlex
Box: Reuse HttpCurl and Invalidate Cached IDs
See more Box Examples
Run the reusable setup once per HttpCurl object, then select names and execute the operation. The setup is repeated here only to make this published example independently runnable. Perform three operations with one configured object: cold file lookup, warm download without lookups, then another download to a different local path after clearing only file state. Functions and output rules are registered only once; their variables are evaluated when used.
See the Box API guide for setup and the complete workflow.
Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoCurl
Handle hoSetupCommand
Integer iSetupReplacements
String sParentName
String sFolderName
String sFileName
Handle hoAuthorizedCommand1
Integer iHeaderReplacement1
Variant vWarmPlan
Handle hoWarmPlan
Handle hoAuthorizedCommand2
Integer iHeaderReplacement2
Handle hoAuthorizedCommand3
Integer iHeaderReplacement3
Handle hoAuthorizedCommand4
Integer iHeaderReplacement4
Handle hoAuthorizedCommand5
Integer iHeaderReplacement5
String sTemp1
Integer iTemp1
Boolean bTemp1
Move False To iSuccess
// Requires Chilkat 11.7.0 or later and a previously unlocked Chilkat bundle.
// See Global Unlock Sample.
// Guide: Box API Guide.
Move False To iSuccess
// BEGIN ONE-TIME SETUP
// This block is repeated so each published example can run on its own.
// In an application, run the setup example once and pass the SAME curl object
// to operation code below. Do not recreate it for every operation.
// See Reusable Box HttpCurl Setup.
Get Create (RefClass(cComChilkatHttpCurl)) To hoCurl
If (Not(IsComObjectCreated(hoCurl))) Begin
Send CreateComObject of hoCurl
End
Send ComSetVar To hoCurl "access_token" "BOX_ACCESS_TOKEN"
Send ComSetVar To hoCurl "parent_name" "/"
// Box's fixed root ID is an implementation detail; callers supply names.
Send ComSetVar To hoCurl "parent_id" "0"
Get Create (RefClass(cComChilkatStringBuilder)) To hoSetupCommand
If (Not(IsComObjectCreated(hoSetupCommand))) Begin
Send CreateComObject of hoSetupCommand
End
// Register findParent; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findParent" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register findFolder; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/{{parent_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findFolder" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register findFile; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/{{folder_id}}/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findFile" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register findDestination; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/folders/0/items?limit=1000&fields=id,type,name" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "findDestination" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register getFileDetails; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}?fields=id,sha1,file_version" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "getFileDetails" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register getEnterprise; registration sends no request.
Get ComSetString Of hoSetupCommand 'curl -X GET "https://api.box.com/2.0/users/me?fields=enterprise" -H "Authorization: Bearer ACCESS_TOKEN"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoSetupCommand "ACCESS_TOKEN" sTemp1 To iSetupReplacements
Get ComGetAsString Of hoSetupCommand To sTemp1
Get ComAddFunction Of hoCurl "getEnterprise" sTemp1 To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Register output rules once. Chilkat 11.7.0 evaluates {{name}} variables
// when extracting each output, using the current value at that time.
Get ComAddOutput2 Of hoCurl "findParent" "entries" "name" "{{parent_name}}" True "id" "parent_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput2 Of hoCurl "findFolder" "entries" "name" "{{folder_name}}" True "id" "folder_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput2 Of hoCurl "findFile" "entries" "name" "{{file_name}}" True "id" "file_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput2 Of hoCurl "findDestination" "entries" "name" "{{destination_name}}" True "id" "destination_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput Of hoCurl "getFileDetails" "file_version.id" "file_version_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput Of hoCurl "getFileDetails" "sha1" "file_sha1" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComAddOutput Of hoCurl "getEnterprise" "enterprise.id" "enterprise_id" To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// END ONE-TIME SETUP
// The name lookups below assume each listing fits in one page (1000 items).
// Parent and destination names select root children; folder_name selects a child
// of parent_name. "/" selects the root parent. These are not arbitrary paths.
// BEGIN OPERATION -- keep the configured object when reusing it.
// Inputs are names. Retain cached IDs when the selected names have not changed.
Move "/" To sParentName
Move "images" To sFolderName
Move "penguins.jpg" To sFileName
Get ComGetVar Of hoCurl "parent_name" To sTemp1
Get ComVarDefined Of hoCurl "parent_id" To bTemp1
If ((sTemp1 <> sParentName) Or ((sParentName = "/") And (bTemp1 = False))) Begin
Send ComSetVar To hoCurl "parent_name" sParentName
Send ComClearVar To hoCurl "parent_id"
Send ComClearVar To hoCurl "folder_id"
Send ComClearVar To hoCurl "file_id"
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
If (sParentName = "/") Begin
Send ComSetVar To hoCurl "parent_id" "0"
End
End
Get ComGetVar Of hoCurl "folder_name" To sTemp1
If (sTemp1 <> sFolderName) Begin
Send ComSetVar To hoCurl "folder_name" sFolderName
Send ComClearVar To hoCurl "folder_id"
Send ComClearVar To hoCurl "file_id"
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
End
Get ComGetVar Of hoCurl "file_name" To sTemp1
If (sTemp1 <> sFileName) Begin
Send ComSetVar To hoCurl "file_name" sFileName
Send ComClearVar To hoCurl "file_id"
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
End
Send ComSetVar To hoCurl "local_path" "qa_output/penguins.jpg"
// Operation 1: get information by name. This resolves folder_id and file_id.
Send ComClearTargetOutput To hoCurl "*"
Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand1
If (Not(IsComObjectCreated(hoAuthorizedCommand1))) Begin
Send CreateComObject of hoAuthorizedCommand1
End
Get ComSetString Of hoAuthorizedCommand1 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}?fields=id,name" -H "Authorization: Bearer {{access_token}}"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoAuthorizedCommand1 "{{access_token}}" sTemp1 To iHeaderReplacement1
Get ComGetAsString Of hoAuthorizedCommand1 To sTemp1
Get ComDoYourThing Of hoCurl sTemp1 To iSuccess
Get ComStatusCode Of hoCurl To iTemp1
If ((iSuccess <> True) Or (iTemp1 <> 200)) Begin
Get ComStatusCode Of hoCurl To iTemp1
Showln "Box request failed. HTTP status: " iTemp1
Get ComFailReason Of hoCurl To iTemp1
Showln "Failure reason: " iTemp1
Get ComResponseBodyStr Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Operation 2: keep the same object and IDs. Only the final download is needed.
Get Create (RefClass(cComChilkatJsonObject)) To hoWarmPlan
If (Not(IsComObjectCreated(hoWarmPlan))) Begin
Send CreateComObject of hoWarmPlan
End
Set ComEmitCompact Of hoWarmPlan To False
Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand2
If (Not(IsComObjectCreated(hoAuthorizedCommand2))) Begin
Send CreateComObject of hoAuthorizedCommand2
End
Get ComSetString Of hoAuthorizedCommand2 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}/content" -H "Authorization: Bearer {{access_token}}" -L -o "{{local_path}}"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoAuthorizedCommand2 "{{access_token}}" sTemp1 To iHeaderReplacement2
Get ComGetAsString Of hoAuthorizedCommand2 To sTemp1
Get pvComObject of hoWarmPlan to vWarmPlan
Get ComExaminePlan Of hoCurl sTemp1 vWarmPlan To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComEmit Of hoWarmPlan To sTemp1
Showln sTemp1
Send ComClearTargetOutput To hoCurl "*"
Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand3
If (Not(IsComObjectCreated(hoAuthorizedCommand3))) Begin
Send CreateComObject of hoAuthorizedCommand3
End
Get ComSetString Of hoAuthorizedCommand3 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}/content" -H "Authorization: Bearer {{access_token}}" -L -o "{{local_path}}"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoAuthorizedCommand3 "{{access_token}}" sTemp1 To iHeaderReplacement3
Get ComGetAsString Of hoAuthorizedCommand3 To sTemp1
Get ComDoYourThing Of hoCurl sTemp1 To iSuccess
Get ComStatusCode Of hoCurl To iTemp1
If ((iSuccess <> True) Or (iTemp1 <> 200)) Begin
Get ComStatusCode Of hoCurl To iTemp1
Showln "Box request failed. HTTP status: " iTemp1
Get ComFailReason Of hoCurl To iTemp1
Showln "Failure reason: " iTemp1
Get ComResponseBodyStr Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Operation 3: explicitly invalidate file state, retaining the known folder.
// Here we select the same name so this demonstration needs only one real file.
// Substitute another filename to switch files in this folder.
// The existing output rule reads the current file_name; do not register it again.
Send ComClearVar To hoCurl "file_id"
Send ComClearVar To hoCurl "file_version_id"
Send ComClearVar To hoCurl "file_sha1"
Send ComSetVar To hoCurl "file_name" "penguins.jpg"
Send ComSetVar To hoCurl "local_path" "qa_output/penguins-copy.jpg"
Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand4
If (Not(IsComObjectCreated(hoAuthorizedCommand4))) Begin
Send CreateComObject of hoAuthorizedCommand4
End
Get ComSetString Of hoAuthorizedCommand4 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}/content" -H "Authorization: Bearer {{access_token}}" -L -o "{{local_path}}"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoAuthorizedCommand4 "{{access_token}}" sTemp1 To iHeaderReplacement4
Get ComGetAsString Of hoAuthorizedCommand4 To sTemp1
Get pvComObject of hoWarmPlan to vWarmPlan
Get ComExaminePlan Of hoCurl sTemp1 vWarmPlan To iSuccess
If (iSuccess <> True) Begin
Get ComLastErrorText Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
Get ComEmit Of hoWarmPlan To sTemp1
Showln sTemp1
Send ComClearTargetOutput To hoCurl "*"
Get Create (RefClass(cComChilkatStringBuilder)) To hoAuthorizedCommand5
If (Not(IsComObjectCreated(hoAuthorizedCommand5))) Begin
Send CreateComObject of hoAuthorizedCommand5
End
Get ComSetString Of hoAuthorizedCommand5 'curl -X GET "https://api.box.com/2.0/files/{{file_id}}/content" -H "Authorization: Bearer {{access_token}}" -L -o "{{local_path}}"' To iSuccess
Get ComGetVar Of hoCurl "access_token" To sTemp1
Get ComReplace Of hoAuthorizedCommand5 "{{access_token}}" sTemp1 To iHeaderReplacement5
Get ComGetAsString Of hoAuthorizedCommand5 To sTemp1
Get ComDoYourThing Of hoCurl sTemp1 To iSuccess
Get ComStatusCode Of hoCurl To iTemp1
If ((iSuccess <> True) Or (iTemp1 <> 200)) Begin
Get ComStatusCode Of hoCurl To iTemp1
Showln "Box request failed. HTTP status: " iTemp1
Get ComFailReason Of hoCurl To iTemp1
Showln "Failure reason: " iTemp1
Get ComResponseBodyStr Of hoCurl To sTemp1
Showln sTemp1
Procedure_Return
End
// Changing parent_name invalidates parent_id, folder_id, and file state.
// Changing folder_name invalidates folder_id and file state.
// Changing destination_name invalidates destination_id.
End_Procedure