Problem/Motivation

Our API endpoint URIs are currently ad hoc and inconsistent, e.g., /api/layout/..., /xb-components, and /xb/api/.... We need a stable, predictable convention.

Proposed resolution

Create a convention that observes generally-accepted industry standards and respects Drupal-specific conventions:

REST API Tutorial URI Naming Conventions and Best Practices has a good overview. API Stylebook Design Guidelines links to concrete precedents.

We need to make sure we don't collide or conflict with other common patterns or solutions in Drupal. For example, it would be begging for problems to do anything under /api/, which someone somewhere is surely already using. We should also avoid /xb/ if we're going to use that path for administrative UI routes.

We should also consider any other paths the module uses and make sure all of them make sense together.

I could imagine, for example, something like this:

/xb/api/{resources} [ /{resourceId} [ /{subCollections} [ /{resourceId} ] ] ]
Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

traviscarden created an issue. See original summary.

traviscarden’s picture

Issue summary: View changes
traviscarden’s picture

Issue summary: View changes
wim leers’s picture

Component: Page builder » Documentation

WFM in general, with one exception:

/xb-api/v1/{resources} [ /{resourceId} [ /{subCollections} [ /{resourceId} ] ] ]

-1 to versioning the API at this time, because that implies it's a public API. It is not. Defining a public API for this that we provide BC for is definitely not in scope.

If you really want to have it, then let's use:

/xb-api/v0/{resources} [ /{resourceId} [ /{subCollections} [ /{resourceId} ] ] ]

(with v0 matching XB's major version: 0.x)

P.S.: I do not understand why

We should also avoid /xb/ if we're going to use that path for administrative UI routes.

matters? /xb-api/… vs /xb/api/… are essentially the same?

effulgentsia’s picture

Instead of /v0/, perhaps we can make it even clearer that it's an internal API by naming it /internal/?

wim leers’s picture

#5++

traviscarden’s picture

Issue summary: View changes

Re: versioning the API, I only proposed it to consider because it's a common industry pattern. If we're not making any stability promises for contrib modules to use it, for example, I see no reason for it. In that case, I don't think we need /internal/ either.

As to avoiding /xb/, I wanted to prevent "namespace" collisions, since we already have some routes at /xb/. But having considered it a little more, I don't think I'm actually worried about it as long as we don't anticipate wanting to use /xb/api/ for anything else. In fact, there would be a certain elegance in it if we can keep everything under /xb/. Perhaps we could do something like /xb/api/ and /xb/routes/ or similar.

I'm updating the issue description accordingly.

larowlan’s picture

Version: » 0.x-dev

I agree with @traviscarden - versioning is a standard practice. It also means we can evolve over time. If we decide the API for an endpoint changes, we start a new version and emit deprecations from the old one.

Another alternative practise is to require consumers to set the version # via an accept header - e.g. github has Accept: application/vnd.github.v3+json

I think it's easier to just put it in the URL, so plus one for v0

wim leers’s picture

Title: Define API URI naming conventions » Rename all XB internal HTTP API routes from `/xb/api/…` to `/xb/api/v0/…`
Component: Documentation » Internal HTTP API
Issue tags: +Novice
Related issues: +#3499703: Make all XB HTTP API routes consistently prefixed, ensure they all have OpenAPI specs, and tests to keep it so

The URI naming was made consistent in #3499703: Make all XB HTTP API routes consistently prefixed, ensure they all have OpenAPI specs, and tests to keep it so 😄

That also means that versioning it today would be trivial.

@traviscarden, would you like to take that on? :D

traviscarden’s picture

Assigned: Unassigned » traviscarden

On it, @wim leers!

traviscarden’s picture

Assigned: traviscarden » wim leers
Status: Active » Needs review

I started to create a static helper to centralize the path generation logic (because it is a little inconsistent), but most of the API path strings were in YAML and JavaScript files, so once I decided not to use it in test classes (because it would make them less expressive), there weren't enough uses left to justify its existence. I'm basically explaining why I didn't have an MR in the 5 minutes it took to do a search-and-replace. 😛 Anyway, here it is. ^

partyka made their first commit to this issue’s fork.

wim leers’s picture

Assigned: wim leers » Unassigned
Status: Needs review » Reviewed & tested by the community

Thanks!

partyka’s picture

There's another merge conflict, working on resolving it.

wim leers’s picture

Status: Reviewed & tested by the community » Needs work

DxRouteConsistencyTest is not currently passing — once it is, I'm looking forward to merging this, and I'm sure @larowlan does too 😄

omkar-pd made their first commit to this issue’s fork.

omkar-pd’s picture

Status: Needs work » Needs review
wim leers’s picture

Assigned: Unassigned » wim leers

Thanks so much! Let’s land this today so y’all can stop chasing HEAD! 🙈

wim leers’s picture

Assigned: wim leers » Unassigned
Status: Needs review » Reviewed & tested by the community

wim leers’s picture

Status: Reviewed & tested by the community » Fixed
Parent issue: » #3521002: [META] Maintainable client-side data model + internal HTTP API

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.