Opinionated
or, We choose so you don't have to
Apigility is an opinionated API builder and
engine.
1: Format: JSON
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
We prefer JSON over XML due to:
how easy it is to transform to native PHP
more compact payloads
more easily understood mapping of objects
more interop between various languages and
services
application/hal+json
{
"_links": {
"self": { "href": "/session/1" }
}
"session_id": 1,
"title": "Apigility: Agile APIs",
"_embedded": {
"speaker": {
"_links": { "self": { "href": "/speaker/1" } }
"speaker_id": 1,
"name": "Matthew Weier O'Phinney"
}
}
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Consistent format
Hypermedia linking built-in
Allows embedded resources
Collections are arrays of embedded resources
Expandable format
2: Error Reporting
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
application/problem+json
{
"type": "/api/problems/forbidden",
"title": "Forbidden",
"detail": "Your API key is missing or invalid.",
"status": 403,
"authenticationUrl": "/api/oauth"
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
HTTP status to indicate an error happened
Consistent error format
Expandable format
3: HTTP Method Negotiation
POST /session HTTP/1.1
Content-Type: application/xml
Foo
405 Method Not Allowed
Allow: GET
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
OPTIONS
OPTIONS /session HTTP/1.1
Content-Type: application/xml
200 OK
Allow: GET
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
4: Content Negotiation: Accept
GET /session HTTP/1.1
Accept: application/xml
406 Not acceptable
Content-Type: application/problem+json
{
"type": "/api/problems/content",
"title": "Not acceptable",
"detail": "This API can deliver application/vnd.zend-con.v1+json, application/hal+json, or application/json only.",
"status": 406
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
4: Content Negotiation: Content-Type
POST /session HTTP/1.1
Content-Type: application/xml
1
415 Unsupported Media Type
Content-Type: application/problem+json
{
"type": "/api/problems/content",
"title": "Unsupported Media Type",
"detail": "This API can accept application/vnd.zend-con.v1+json, application/hal+json, or application/json only.",
"status": 415
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
5: Validation
PATCH /session/1 HTTP/1.1
Content-Type: application/json
{ "title": {"foo":"bar"} }
422 Unprocessable Entity
Content-Type: application/problem+json
{
"type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
"title": "Unprocessable Entity",
"detail": "Failed validation",
"status": 422,
"validation_messages": {
"title": "Invalid title; must be a non-empty string"
}
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Validate early; return errors immediately
Build validation as part of your API specification
Return "400 Client Error" if no fields match, "422 Unprocessable Entity" when validation errors occur
6: Authentication
HTTP Basic and Digest (for internal APIs)
OAuth2 (for public APIs)
Event-driven, to accommodate anything else
Return a problem response early if invalid
credentials are provided
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Authentication
GET /session/1 HTTP/1.1
Authorization: Basic foobar
Accept: application/json
401 Unauthorized
Content-Type: application/problem+json
{
"type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
"title": "Unauthorized",
"detail": "Unauthorized",
"status": 401
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
7: Authorization
Public by default
Restrict by service and/or specific HTTP
methods
Return a problem response early if the
identified user does not have authorization
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Authorization
GET /session/1 HTTP/1.1
Accept: application/json
403 Forbidden
Content-Type: application/problem+json
{
"type": "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html",
"title": "Forbidden",
"detail": "Forbidden",
"status": 403
}
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
8: Versioning by Default
URL-based* versioning: /v1/session,
/v2/session
Mediatype versioning:
Accept: application/vnd.status.v2+json
Code is versioned by namespace.
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Versioning allows evolution of an API
Prevent existing clients from breaking
Require clients to opt-in to new versions of the API
Only develop and make changes on the current API version
9: Document all the things!
Why services exist
Why methods are exposed
What request and response payloads should contain
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Export documentation
Export captured documentation
Export other captured settings, such as Content
Negotiation, allowed HTTP methods, authorization requirements,
etc.
Export to the format of your choice
Serialization Format
Error Reporting
HTTP Negotiation
Content Negotiation
Validation
Authentication
Authorization
Versioning
Documentation
Planned are one or more of the following:
Swagger
API Blueprint
RAML
Bonus: Hyperlinking: Pagination
Invoked automatically by returning
Zend\Paginator\Paginator.
{
_links: {
self: { href: "/api/session?page=3" },
first: { href: "/api/session" },
last: { href: "/api/session?page=14" },
prev: { href: "/api/session?page=2" },
next: { href: "/api/session?page=4" }
}
}