#LoopBack Cheatsheet
Instantiate the sls-sample-app
slc lb api-example
cd sls-sample-app
slc install strong-agent
slc install
slc run app.js
Create a custom LoopBack Node server
slc lb workspace loopback-workspace
cd loopback-workspace/
slc lb project loopback-project
cd loopback-project/
slc install
slc run .
Add a custom model type : product
slc lb model product
#Running your Loopback server run
slc run .
debug
slc debug .
Run with verbose output
DEBUG=* node app.js
##Exploring LoopBack Verify the server is running localhost:3000/ API explorer http://localhost:3000/explorer/ Routes Inventory http://localhost:3000/routes LoopBack Docs http://docs.strongloop.com/loopback#modelfindfilter-callback
Test the endpoint for the product model type: verif '[ ]' empty set localhost:3000/products
open http://localhost:3000/products
Add some test data of type product
//add some test data with curl to the 'product' model type
curl -X POST -H "Content-Type:application/json" -d '{"name": "Product A", "inventory": 11, "UPC": "127890"}' http://localhost:3000/products;
curl -X POST -H "Content-Type:application/json" -d '{"name": "Product B", "inventory": 22, "UPC": "127891"}' http://localhost:3000/products;
curl -X POST -H "Content-Type:application/json" -d '{"name": "Product C", "inventory": 33, "UPC": "127892"}' http://localhost:3000/products;
curl -X POST -H "Content-Type:application/json" -d '{"name": "Product D", "inventory": 44, "UPC": "123893"}' http://localhost:3000/products
Test the endpoint for the product model type: and verify newly added product instances localhost:3000/products
data Source : http://bluewaterboats.org/valiant-40/
Start interactive mode
slc model sailboat -i
Define the schema
"designer" "builder" "loa" "lwl" "beam" "draft" "ballast" "displacement" "sailarea"
Add some default data to the repo
curl -X POST -H "Content-Type:application/json" -d '{"designer": "Robert H. Perry","builder": "Valiant Yachts","loa": "39’ 11″ (12.16 m.)","lwl": " 34’ 0″ (10.36 m.)","beam": "12’ 4″ (3.76 m.)","draft": "6’ 0″ (1.83 m.)","ballast": "7,700 lbs. (3,493 kg.)","displacement": "22,500 lbs. (10,206 kg.)","sailarea": "772 sq. ft. (71.7 sq. m.)" }' http://localhost:3000/sailboats;
curl -X POST -H "Content-Type:application/json" -d '{"designer": "Robert H. Perry","builder": "Valiant Yachts","loa": "37′ 0″","lwl": "31′ 7″","beam": "11′ 5″","draft": "5′ 9″","ballast": " 6,600 lbs","displacement": "17,000 lbs","sailarea": "667 sqft" }' http://localhost:3000/sailboats;
curl -X POST -H "Content-Type:application/json" -d '{"designer": "Robert H. Perry","builder": "Valiant Yachts","loa": "37′ 0″","lwl": "31′ 7″","beam": "11′ 5″","draft": "5′ 9″","ballast": " 6,600 lbs","displacement": "17,000 lbs","sailarea": "667 sqft" }' http://localhost:3000/sailboats;
curl -X POST -H "Content-Type:application/json" -d '{"designer": "Robert H. Perry","builder": "Valiant Yachts","loa": "37′ 0″","lwl": "31′ 7″","beam": "11′ 5″","draft": "5′ 9″","ballast": " 6,600 lbs","displacement": "17,000 lbs","sailarea": "667 sqft" }' http://localhost:3000/sailboats
- template
curl -X POST -H "Content-Type:application/json" -d '{"designer": "","builder": "","loa": "","lwl": "","beam": "","draft": "","ballast": "","displacement": "","sailarea": "" }' http://localhost:3000/sailboats
Verify the data from the browser localhost:/3000/sailboats;
add docs: insert app.docs({basePath: 'http://localhost:3000'});
add the API Browser : http://localhost:3000/explorer/#!/sailboats/sail_find_get_4
iOS App
- Coming Soon* Android Sample Titanium Sample Xamarin Sample
- Coming Soon* Mobile Web Angular
SDK install path : /usr/local/share/strongloop-node/strongloop/sdks
open /usr/local/share/strongloop-node/strongloop/sdks/
X.h #import <LoopBack/LoopBack.h>
git clone mobile-solution
-
(void) findProductLowestInventory {
//Find the Product with the Product With the Lowest Inventory
// Docs reference: // http://docs.strongloop.com/loopback/#example-request-4
// HTTP REST Call: // http://localhost:3000/products?filter%5Blimit%5D=2
void (^staticMethodErrorBlock)(NSError *) = ^(NSError *error) { NSLog( @"Error %@", error.description); [AppDelegate showGuideMessage: @"No Server Found"]; };//end selfFailblock
// Define the load success block for the LBModelPrototype allWithSuccess message void (^staticMethodSuccessBlock)() = ^(id result) { NSLog(@"Success on Static Method result: %@", result);
LBModel *model = (LBModel *)[result objectAtIndex:0]; self.labelMethod1.text = [[NSString alloc] initWithFormat:@"%@ - %@", [model objectForKeyedSubscript:@"name"] , (int)[model objectForKeyedSubscript:@"inventory"] ];
};//end staticMethodSuccessBlock
LBModelPrototype *objectProto = [ [AppDelegate adapter] prototypeWithName:@"products"];
[[ [AppDelegate adapter] contract] addItem:[SLRESTContractItem itemWithPattern:@"/products" verb:@"GET"] forMethod:@"products.filter"];
//Product with lowest inventory // http://localhost:3000/products?filter[order]=inventory%20ASC&filter[limit]=1': The highest inventory products [objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[order]":@"inventory ASC",@"filter[limit]":@1} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
}//end findPoductLowestInventory
-
(void) findProductLowestPrice {
//Find the Product with the Product With the Lowest Inventory
// Docs reference: // http://docs.strongloop.com/loopback/#example-request-4
// HTTP REST Call: // http://localhost:3000/products?filter%5Blimit%5D=2
void (^staticMethodErrorBlock)(NSError *) = ^(NSError *error) { NSLog( @"Error %@", error.description); [AppDelegate showGuideMessage: @"No Server Found"]; };//end selfFailblock
// Define the load success block for the LBModelPrototype allWithSuccess message void (^staticMethodSuccessBlock)() = ^(id result) { NSLog(@"Success on Static Method result: %@", result);
LBModel *model = (LBModel *)[result objectAtIndex:0]; self.labelMethod2.text = [[NSString alloc] initWithFormat:@"%@ - %@", [model objectForKeyedSubscript:@"name"], [model objectForKeyedSubscript:@"price"] ];
};//end staticMethodSuccessBlock
LBModelPrototype *objectProto = [ [AppDelegate adapter] prototypeWithName:@"products"];
[[ [AppDelegate adapter] contract] addItem:[SLRESTContractItem itemWithPattern:@"/products" verb:@"GET"] forMethod:@"products.filter"];
//Product with lowest inventory // http://localhost:3000/products?filter[order]=inventory%20ASC&filter[limit]=1': The highest inventory products [objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[order]":@"price ASC",@"filter[limit]":@1} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
}//end findProductHighest
//Filter Limit 2 http://localhost:3000/products?filter%5Blimit%5D=2
//[objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[limit]":@2} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
//Filter Pagination 2 http://localhost:3000/products?filter[limit]=2&filter[offset]=5
// TODO [objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[limit]=2&filter[offset]=5":@2} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
//Products with name Product A http://localhost:3000/products?filter[where][name]='Product A':
// TODO [objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[where][name]":@"Product A"} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
// Product with highest inventory
// http://localhost:3000/products?filter[order]=inventory%20DESC&filter[limit]=1': The highest inventory products
//[objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[order]=inventory&DESC&filter[limit]":@1} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
//Product sorted Ascending ASC Descending DESC
// http://localhost:3000/products?filter[order]=inventory%20ASC&filter[limit]=1': The highest inventory products
//[objectProto invokeStaticMethod:@"filter" parameters:@{ @"filter[order]":@"inventory DESC"} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
//'/weapons?filter[fields][name]=1&filter[fields][effectiveRange]=1': Only name and effective ranges
//'/weapons?filter[where][effectiveRange][gt]=900&filter[limit]=3': The top 3 weapons with a range over 900 meters
//'/locations': Locations
//'/locations?filter[where][geo][near]=153.536,-28.1&filter[limit]=3': The 3 closest locations to a given geo point
/*
[[[AppDelegate adapter] contract] addItem:[SLRESTContractItem itemWithPattern:@"/location/nearby" verb:@"GET"] forMethod:@"locations.getNearestFew"];
[LocationProto invokeStaticMethod:@"getNearestFew" parameters:@{
@"here": @{
@"lat": 37.587409,
@"lng": -122.338225
}
} success:staticMethodSuccessBlock failure:staticMethodErrorBlock];
*/
-( void) customMethod1 {
// Define the load error functional block
void (^staticMethodErrorBlock)(NSError *) = ^(NSError *error) {
NSLog( @"Error %@", error.description);
[AppDelegate showGuideMessage: @"No Server Found"];
};//end selfFailblock
// Define the load success block for the LBModelPrototype allWithSuccess message
void (^staticMethodSuccessBlock)() = ^(id result) {
NSLog(@"Success on Static Method result: %@", result);
self.labelMethod1.text = @"Response 1";
};//end staticMethodSuccessBlock
//Get a local representation of the 'cars' model type
LBModelPrototype *objectB = [ [AppDelegate adapter] prototypeWithName:@"cars"];
[[ [AppDelegate adapter] contract] addItem:[SLRESTContractItem itemWithPattern:@"/cars/custommethod1" verb:@"GET"] forMethod:@"cars.custommethod1"];
// Invoke the invokeStaticMethod message for the 'cars' LBModelPrototype
// Equivalent http JSON endpoint request : http://localhost:3000/cars/custommethod1
[objectB invokeStaticMethod:@"custommethod1" parameters:@{} success:staticMethodSuccessBlock failure:staticMethodErrorBlock ];
}//end CustomMethod1
-( void) customMethod2 { // Define the load error functional block void (^staticMethodErrorBlock)(NSError *) = ^(NSError *error) { NSLog( @"Error %@", error.description); [AppDelegate showGuideMessage: @"No Server Found"]; };//end selfFailblock
// Define the load success block for the LBModelPrototype allWithSuccess message
void (^staticMethodSuccessBlock)() = ^(id result) {
NSLog(@"Success on Static Method result: %@", result);
self.labelMethod2.text = @"Response 2";
};//end staticMethodSuccessBlock
//Get a local representation of the 'cars' model type
LBModelPrototype *objectB = [ [AppDelegate adapter] prototypeWithName:@"cars"];
[[ [AppDelegate adapter] contract] addItem:[SLRESTContractItem itemWithPattern:@"/cars/custommethod2" verb:@"GET"] forMethod:@"cars.custommethod2"];
// Invoke the invokeStaticMethod message for the 'cars' LBModelPrototype
// Equivalent http JSON endpoint request : http://localhost:3000/cars/custommethod2?arg1=yack&arg2=123
[objectB invokeStaticMethod:@"custommethod2" parameters:@{@"arg1":@"yack" , @"arg2":@123} success:staticMethodSuccessBlock failure:staticMethodErrorBlock ];
}//end CustomMethod2
-
(void)customMethod3 { // ++++++++++++++++++++++++++++++++++++ // Uncomment the comment block below to call a custom method on the server // ++++++++++++++++++++++++++++++++++++
// Define the load error functional block void (^staticMethodErrorBlock)(NSError *) = ^(NSError *error) { NSLog( @"Error %@", error.description); [AppDelegate showGuideMessage: @"No Server Found"]; };//end selfFailblock
// Define the load success block for the LBModelPrototype allWithSuccess message void (^staticMethodSuccessBlock)() = ^(id result) { NSLog(@"Success on Static Method result: %@", result); };//end staticMethodSuccessBlock
//Get a local representation of the 'cars' model type LBModelPrototype *objectB = [ [AppDelegate adapter] prototypeWithName:@"cars"]; [[ [AppDelegate adapter] contract] addItem:[SLRESTContractItem itemWithPattern:@"/cars/custommethod3" verb:@"GET"] forMethod:@"cars.custommethod3"];
// Invoke the invokeStaticMethod message for the 'cars' LBModelPrototype // Equivalent http JSON endpoint request : http://localhost:3000/cars/custommethod3?arg1=yack&arg2=123 [objectB invokeStaticMethod:@"custommethod3" parameters:@{@"arg1":@"yack" , @"arg2":@123} success:staticMethodSuccessBlock failure:staticMethodErrorBlock ];
}//end customMethod3