Top Banner
#NeverRest RESTful API Design Best Practices Using ASP.NET Web API Spencer Schneidenbach @schneidenbach
69

RESTful API Design Best Practices Using ASP.NET Web API

Feb 11, 2017

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: RESTful API Design Best Practices Using ASP.NET Web API

#NeverRestRESTful API Design Best

PracticesUsing ASP.NET Web API

Spencer Schneidenbach

@schneidenbach

Page 2: RESTful API Design Best Practices Using ASP.NET Web API

Slides, links, and more at rest.schneids.net

@schneidenbach#NeverRest

Page 3: RESTful API Design Best Practices Using ASP.NET Web API

Why?@schneidenbach#NeverRest

Page 4: RESTful API Design Best Practices Using ASP.NET Web API

Developers have the power of choice

@schneidenbach#NeverRest

Page 5: RESTful API Design Best Practices Using ASP.NET Web API

Long-term benefits

@schneidenbach#NeverRest

Go from 0 to “make magic happen”

Learn stuff and manage exceptions

Page 6: RESTful API Design Best Practices Using ASP.NET Web API

Developers have the power of choice

@schneidenbach#NeverRest

Page 7: RESTful API Design Best Practices Using ASP.NET Web API

Developers have an opportunity create something better than the

competition

@schneidenbach#NeverRest

Page 8: RESTful API Design Best Practices Using ASP.NET Web API

API Design is UX for Developers

@schneidenbach#NeverRest

Page 9: RESTful API Design Best Practices Using ASP.NET Web API

This quote sums it up nicely

If you don’t make usability a priority, you’ll never have to worry about scalability.

-Kirsten Hunter @synedra

@schneidenbach#NeverRest

Page 10: RESTful API Design Best Practices Using ASP.NET Web API

Some common themes

@schneidenbach#NeverRest

Page 11: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 12: RESTful API Design Best Practices Using ASP.NET Web API

Simple != Easy

@schneidenbach#NeverRest

Page 13: RESTful API Design Best Practices Using ASP.NET Web API

There’s No Silver Bullet

@schneidenbach#NeverRest

Page 14: RESTful API Design Best Practices Using ASP.NET Web API

What is REST?

Representational State Transfer

@schneidenbach#NeverRest

Page 15: RESTful API Design Best Practices Using ASP.NET Web API

Uniform InterfaceCode on Demand

(optional)Layered

StatelessCacheableClient-Server

The Six Constraints of REST

@schneidenbach#NeverRest

Page 16: RESTful API Design Best Practices Using ASP.NET Web API

Resource identification

Uniform Interface constraint

Content-Type:

application/json

Resource manipulation with

representations

Self-descriptive Hypermedia as the engine of

application state (HATEOAS)

GET /employees/1234

PUT /employees/1234

@schneidenbach#NeverRest

Page 17: RESTful API Design Best Practices Using ASP.NET Web API

What is a RESTful API?RESTful API == an API that follows REST architecture

Term has been sort of co-opted

REST != JSONREST != HTTP

Lots of people say “REST API” when they really mean HTTP JSON API

@schneidenbach#NeverRest

Page 18: RESTful API Design Best Practices Using ASP.NET Web API

Pragmatic REST

RESTful API != Good API

@schneidenbach#NeverRest

Page 19: RESTful API Design Best Practices Using ASP.NET Web API

Do what makes sense. Throw out the rest.

Is that vague enough for you?

@schneidenbach#NeverRest

Page 20: RESTful API Design Best Practices Using ASP.NET Web API

MaintainDocument

ImplementDesign

API Design Process

@schneidenbach#NeverRest

Page 21: RESTful API Design Best Practices Using ASP.NET Web API

Designing your RESTful APII HAVE ONE RULE… okay I actually have two rules

@schneidenbach#NeverRest

Page 22: RESTful API Design Best Practices Using ASP.NET Web API

KISS(or, Keep it Simple, Stupid)

@schneidenbach#NeverRest

Page 23: RESTful API Design Best Practices Using ASP.NET Web API

KISS

Don’t be creative.

Provide what is necessary – no more, no less.

Use a handful of HTTP status codes.

@schneidenbach#NeverRest

Page 24: RESTful API Design Best Practices Using ASP.NET Web API

403 Forbidden(aka you can’t do that)

401 Unauthorized(aka not authenticated)

404 Not Found

400 Bad Request201 Created200 OK

Good HTTP Codes

@schneidenbach#NeverRest

Page 25: RESTful API Design Best Practices Using ASP.NET Web API

KISS

{ "id": 1234, "active": true, "nameId": 345}

{ "id": 345, "name": "Acme"}

Customer API Name API

GET /customers/1234 GET /names/345

@schneidenbach#NeverRest

Page 26: RESTful API Design Best Practices Using ASP.NET Web API

KISS

That’s TWO REQUESTS per GET

That’s TWO REQUESTS per POST

What’s the point?

@schneidenbach#NeverRest

Page 27: RESTful API Design Best Practices Using ASP.NET Web API

Don’t let your specific implementations leak if they are

hard to use or understand.

@schneidenbach#NeverRest

Page 28: RESTful API Design Best Practices Using ASP.NET Web API

KISS

{ "id": 1234, "active": true, "name": "Acme"}

Customer API

GET /customers/1234

@schneidenbach#NeverRest

Page 29: RESTful API Design Best Practices Using ASP.NET Web API

KISS

TheoryAnnexThresholdLilia

@schneidenbach#NeverRest

Page 30: RESTful API Design Best Practices Using ASP.NET Web API

KISSInactiveDeletedVisibleRetired

@schneidenbach#NeverRest

Page 31: RESTful API Design Best Practices Using ASP.NET Web API

Second big rule – Be Consistent

Be consistent with accepted best practices.

Be consistent with yourself.

@schneidenbach#NeverRest

Page 32: RESTful API Design Best Practices Using ASP.NET Web API

PATCHDELETE

POSTPUTGET

Understanding verbs

Remember consistency!@schneidenbach#NeverRest

Page 33: RESTful API Design Best Practices Using ASP.NET Web API

Don’t mutate data with GETs.

@schneidenbach#NeverRest

Page 34: RESTful API Design Best Practices Using ASP.NET Web API

Resource identificationNouns vs. verbs

Basically, use plural nouns

@schneidenbach#NeverRest

Page 35: RESTful API Design Best Practices Using ASP.NET Web API

{ "invoices": [ { ... }, { ... } ]}

GET /customers/1234/invoic

es

GET /customers/1234?expand=invoices

Within the parent object

Sub-resource strategies

As a separate request Using an expand parameter

Be consistent, but be flexible when it makes sense

@schneidenbach#NeverRest

Page 36: RESTful API Design Best Practices Using ASP.NET Web API

GET considerations

SortingFiltering

Paging@schneidenbach#NeverRest

Page 37: RESTful API Design Best Practices Using ASP.NET Web API

Sorting/Ordering

$orderBy=name desc

$orderBy=name desc,hireDate

@schneidenbach#NeverRest

Page 38: RESTful API Design Best Practices Using ASP.NET Web API

Filtering

$filter=(name eq 'Milk' or name eq 'Eggs') and price lt 2.55

@schneidenbach#NeverRest

Page 39: RESTful API Design Best Practices Using ASP.NET Web API

Sorting and filtering for free

Google “OData web api”

@schneidenbach#NeverRest

Page 40: RESTful API Design Best Practices Using ASP.NET Web API

PagingGET /customers? page=1 & pageSize=1000

{"pageNumber": 1,"results": [...],"nextPage": "/customers?page=2"

}

Good paging example on my blog: rest.schneids.net

@schneidenbach#NeverRest

Page 41: RESTful API Design Best Practices Using ASP.NET Web API

Do I need to sort/page/filter?

Maybe!

What do your consumers need?

@schneidenbach#NeverRest

Page 42: RESTful API Design Best Practices Using ASP.NET Web API

Versioning

Your APIs should stand a test of time

@schneidenbach#NeverRest

Page 43: RESTful API Design Best Practices Using ASP.NET Web API

Versioning

GET /customersHost: contoso.comAccept: application/jsonX-Api-Version: 1

@schneidenbach#NeverRest

POST /customersHost: contoso.comAccept: application/jsonX-Api-Version: 2.0

Page 44: RESTful API Design Best Practices Using ASP.NET Web API

Versioning

Use URL versioning@schneidenbach#NeverRest

GET /v1/customersHost: contoso.comAccept: application/json

Page 45: RESTful API Design Best Practices Using ASP.NET Web API

Error reporting

Errors are going to happen.

How will you manage them?

@schneidenbach#NeverRest

Page 46: RESTful API Design Best Practices Using ASP.NET Web API

Error reporting

{ "name": "Arana Software"}

@schneidenbach#NeverRest

Requires name and state

POST /vendors

400 Bad Request

Content-Type: application/json

"State is required."

{ "firstName": "Spencer"}

Requires first and last name

POST /employees

400 Bad Request

Content-Type: application/json

{

"errorMessage": "Your request was invalid."

}

Page 47: RESTful API Design Best Practices Using ASP.NET Web API

Error reporting

@schneidenbach#NeverRest

Page 48: RESTful API Design Best Practices Using ASP.NET Web API

Error reporting

Make finding and fixing errors as easy on your consumer as possible.

@schneidenbach#NeverRest

Page 49: RESTful API Design Best Practices Using ASP.NET Web API

AuthenticationEncryption

Security

@schneidenbach#NeverRest

Page 50: RESTful API Design Best Practices Using ASP.NET Web API

Use SSL.

Don’t roll your own encryption.

Pick an auth strategy that isn’t Basic.

@schneidenbach#NeverRest

Security

Page 51: RESTful API Design Best Practices Using ASP.NET Web API

Ok, time for some code examplesand practical advise

@schneidenbach#NeverRest

Page 52: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Controller Anatomy

Page 53: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 54: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 55: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 56: RESTful API Design Best Practices Using ASP.NET Web API

Use DTOs/per-request objects@schneidenbach#NeverRest

Page 57: RESTful API Design Best Practices Using ASP.NET Web API

Separation of concerns

@schneidenbach#NeverRest

Page 58: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 59: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 60: RESTful API Design Best Practices Using ASP.NET Web API

Separation of concerns

@schneidenbach#NeverRest

Controllers should know “where,” not ”how.”

Page 61: RESTful API Design Best Practices Using ASP.NET Web API

@schneidenbach#NeverRest

Page 62: RESTful API Design Best Practices Using ASP.NET Web API

Validation

@schneidenbach#NeverRest

Page 63: RESTful API Design Best Practices Using ASP.NET Web API

Validation

Validate. Validate. Validate.

@schneidenbach#NeverRest

Separate validation logic from object.

Google Fluent Validation

Page 64: RESTful API Design Best Practices Using ASP.NET Web API

Controller

Good Architecture

Request Handler/ServiceValidator

Enforce separation of concerns for maintainability and testability.

Google MediatR

Page 65: RESTful API Design Best Practices Using ASP.NET Web API

Gotchas/ErrorsFormatting

SchemaParametersEndpoints

Documentation

@schneidenbach#NeverRest

Page 66: RESTful API Design Best Practices Using ASP.NET Web API

Documentation

A good API lives and dies by its documentation.

(you should tweet that out)

@schneidenbach#NeverRest

Page 67: RESTful API Design Best Practices Using ASP.NET Web API

Maintaining your APIVendor: “Hey, we’ve made some under-the-cover changes to our endpoint. It shouldn’t impact you, but let us know if it breaks something.”

Us: ”Okay. Can you release it to test first so we can run our integration tests against the endpoint and make sure everything works?”

Vendor: ”Well, actually we need it ASAP, so we’re releasing to prod in an hour.”

@schneidenbach#NeverRest

Page 68: RESTful API Design Best Practices Using ASP.NET Web API

Maintaining your API

Fix bugs and optimize.

Don’t introduce breaking changes like removing properties.

@schneidenbach#NeverRest

Page 69: RESTful API Design Best Practices Using ASP.NET Web API

Thank you!Slides, resources at rest.schneids.net

schneids.net

@schneidenbach