Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exposing the JSON Schema for API endpoints?

Is there a standard to where and how to expose the schema of API endpoints?

For example, let's say the following API endpoints are available:

api/companies/

api/companies/{id}/employees/

Where should the schema for the company and employee resources be exposed?

api/company-schema.json and api/employee-schema.json?

api/schemas/company.json and api/schemas/employee.json?

like image 884
Dave New Avatar asked Apr 18 '16 07:04

Dave New


People also ask

What is JSON Schema and how to use it?

After generating the JSON Schema, we can then use this schema to generate code when we implement our API. The schema is also useful as formal documentation for our API’s clients, as they can generate client code that uses our API resources. The following listing contains the schema for our API’s resources.

How accurate are API docs generated by JSON Schema?

Documenting API endpoints via JSON Schema is better than updating docs in a manual, ad-hoc manner, but this process does not ensure that the docs are accurate. To verify the accuracy of the docs generated by JSON Schema files, API requests and responses must be validated against the JSON Schema files.

How do I test that API requests and responses match JSON Schema?

In the Platform API’s test suite, we use the committee gem to see that JSON responses from our API match the structure of the corresponding JSON Schema files. If the test for an endpoint passes the assert_schema_conform method provided by the committee gem, we know that our API requests and responses match the definitions in JSON Schema.

What happens if the API response does not match the schema?

If the API response does not match the JSON Schema when the test is run, the test will fail. And there you have it! A simple way to check your JSON API responses against a JSON Schema.


1 Answers

You can setup your schema endpoints any way you like, but you should use one of the recommended correlation methods. The idea is that there is no universal rule for accessing schemas. Instead, the resource itself identifies the schema that describes it.

So, feel free to expose your schemas any way you like. And then feel free to change it if you need to without fear of breaking client implementations. Just change your response headers to point to the new schema and clients should be able to handle the change dynamically.

The most straightforward correlation method is to include a describedby Link header.

HTTP/1.1 200 OK
Content-Type: application/json
Link: </schema/companies>; rel="describedby"

{ ... }

The other option is to use the schema content-type parameter. (Note: Previous versions of JSON Schema used profile instead of schema).

HTTP/1.1 200 OK
Content-Type: application/json; schema="/schema/companies"

{ ... }

However, the schema parameter is not actually defined for the application/json media-type, so there are potential interoperability issues with that method. That's one reason why the application/schema-instance+json media type was introduced. It works just like application/json, but defines a few capabilities that the normal JSON media-type doesn't.

HTTP/1.1 200 OK
Content-Type: application/schema-instance+json; schema="/schema/companies"

{ ... }

EDIT 2020/24/01: Fix broken link and update answer to reflect changes in recent drafts.

like image 102
Jason Desrosiers Avatar answered Oct 23 '22 09:10

Jason Desrosiers