loopback/docs/rest.md

7.1 KiB

#Model REST API

LoopBack automatically binds a model to a list of HTTP endpoints that provide REST APIs for CRUD and other remote operations.

##Sample Model

We use the following Location model as an example to illustrate generated REST APIs.

{
  "name": "Location",
  "options": {
    "idInjection": false
  },
  "properties": {
    "id": {
      "type": "String",
      "length": 20,
      "id": 1
    },
    "street": {
      "type": "String",
      "required": false,
      "length": 20
    },
    "city": {
      "type": "String",
      "required": false,
      "length": 20
    },
    "zipcode": {
      "type": "Number",
      "required": false,
      "length": 20
    },
    "name": {
      "type": "String",
      "required": false,
      "length": 20
    },
    "geo": {
      "type": "GeoPoint"
    }
  }
}

By default, the REST APIs are mounted to /pluralFormOfTheModelName, for example, /locations.

CRUD remote methods

  • Model.create
  • Model.upsert
  • Model.exists
  • Model.findById
  • Model.find
  • Model.findOne
  • Model.deleteById
  • Model.count
  • Model.prototype.updateAttributes
  • Model.prototype.reload

Custom remote methods

To expose a JavaScript method as REST API, we can simply describe the method as follows:

loopback.remoteMethod(
  RentalLocation.nearby,
  {
    description: 'Find nearby locations around the given geo point',
    accepts: [
      {arg: 'here', type: 'GeoPoint', required: true},
      {arg: 'page', type: 'Number'},
      {arg: 'max', type: 'Number', description: 'max distance in miles'}
    ],
    returns: {arg: 'locations', root: true},
    http: {verb: 'POST', path: '/nearby'}
  }
);

The remoting is defined using the following properties:

  • description: Description of the REST API
  • accepts: An array of parameter description
  • returns: Description of the return value
  • http: Binding to the HTTP endpoint

##Generated APIs

###create

Create a new instance of the model and persist it into the data source

####Definition

POST /locations

####Arguments

  • data

####Example Request curl -X POST -H "Content-Type:application/json" -d '' http://localhost:3000/locations

####Example Response

####Potential Errors

  • None

###upsert

Update or create a model instance

####Definition

PUT /locations

####Arguments

  • data

####Example Request curl -X PUT -H "Content-Type:application/json" -d '' http://localhost:3000/locations

####Example Response

####Potential Errors

  • None

###exists

Check the existence of a model instance by id

####Definition

GET /locations/exists

####Arguments

  • id

####Example Request curl http://localhost:3000/locations/exists/88

####Example Response

{
    "exists": true
}

####Potential Errors

  • None

###findById

Retrieve a model instance by id

####Definition

GET /locations/{id}

####Arguments

  • id

####Example Request curl http://localhost:3000/locations/88

####Example Response

{
    "id": "88",
    "street": "390 Lang Road",
    "city": "Burlingame",
    "zipcode": 94010,
    "name": "Bay Area Firearms",
    "geo": {
        "lat": 37.5874391,
        "lng": -122.3381437
    }
}

####Potential Errors

  • None

###find

Find all model instances matching the filter

####Definition

GET /locations

####Arguments

  • filter

####Example Request curl http://localhost:3000/locations

####Example Response

[
  {
    "id": "87",
    "street": "7153 East Thomas Road",
    "city": "Scottsdale",
    "zipcode": 85251,
    "name": "Phoenix Equipment Rentals",
    "geo": {
      "lat": 33.48034450000001,
      "lng": -111.9271738
    }
  },
  {
    "id": "88",
    "street": "390 Lang Road",
    "city": "Burlingame",
    "zipcode": 94010,
    "name": "Bay Area Firearms",
    "geo": {
      "lat": 37.5874391,
      "lng": -122.3381437
    }
  }
]

####Potential Errors

  • None

###findOne

Find one model instance matching the filter

####Definition

GET /locations/findOne

####Arguments

  • filter

####Example Request curl http://localhost:3000/locations/findOne

####Example Response

{
  "id": "87",
  "street": "7153 East Thomas Road",
  "city": "Scottsdale",
  "zipcode": 85251,
  "name": "Phoenix Equipment Rentals",
  "geo": {
    "lat": 33.48034450000001,
    "lng": -111.9271738
  }
}

####Potential Errors

  • None

###deleteById

Delete a model instance by id

####Definition

DELETE /locations/{id}

####Arguments

  • id

####Example Request curl -X DELETE http://localhost:3000/locations/88

####Example Response

####Potential Errors

  • None

###count

Count the number of model instances matching the where criteria

####Definition

GET /locations/count

####Arguments

  • where

####Example Request curl http://localhost:3000/locations/count

####Example Response

{
    count: 6
}

####Potential Errors

  • None

###nearby

Find nearby locations around a given geolocation

####Definition

GET /locations/nearby

####Arguments

  • here
  • page
  • max - max distance in miles

####Example Request curl http://localhost:3000/locations/nearby?here[lat]=37.587409&here[lng]=-122.338225

####Example Response

[
  {
    "id": "88",
    "street": "390 Lang Road",
    "city": "Burlingame",
    "zipcode": 94010,
    "name": "Bay Area Firearms",
    "geo": {
      "lat": 37.5874391,
      "lng": -122.3381437
    }
  },
  {
    "id": "89",
    "street": "1850 El Camino Real",
    "city": "Menlo Park",
    "zipcode": 94027,
    "name": "Military Weaponry",
    "geo": {
      "lat": 37.459525,
      "lng": -122.194253
    }
  }
]

####Potential Errors

  • None

###update

Update a model instance by id

####Definition

PUT /locations/{id}

####Arguments

  • data
  • id

####Example Request curl -X PUT -H "Content-Type:application/json" -d '' http://localhost:3000/locations/{id}

####Example Response

####Potential Errors

  • None

###reload

Reload a model instance by id

####Definition

POST /locations/{id}/reload

####Arguments

  • id

####Example Request curl -X POST -H "Content-Type:application/json" -d '' http://localhost:3000/locations/{id}/reload

####Example Response

####Potential Errors

  • None

###getInventory

Follow the relations from location to inventory to get a list of items for a given location

####Definition

GET /locations/{id}/inventory

####Arguments

  • where
  • id

####Example Request curl http://localhost:3000/locations/88/inventory

####Example Response

[
  {
    "productId": "2",
    "locationId": "88",
    "available": 10,
    "total": 10
  },
  {
    "productId": "3",
    "locationId": "88",
    "available": 1,
    "total": 1
  }
]

####Potential Errors

  • None