API-First Drupal: what's new in 8.7?
Drupal 8.7 was released with huge API-First improvements!
The REST API only got fairly small improvements in the 7th minor release of Drupal 8, because it reached a good level of maturity in 8.6 (where we added file uploads, exposed more of Drupal’s data model and improved DX.), and because we of course were busy with JSON:API :)
Thanks to everyone who contributed!
- JSON:API #2843147
Need I say more? :) After keeping you informed about progress in October, November, December and January, followed by one of the most frantic Drupal core contribution periods I’ve ever experienced, the JSON:API module was committed to Drupal 8.7 on March 21, 2019.
Surely you’re know thinking But when should I use Drupal’s JSON:API module instead of the REST module? Well, choose REST if you have non-entity data you want to expose. In all other cases, choose JSON:API.
In short, after having seen people use the REST module for years, we believe JSON:API makes solving the most common needs an order of magnitude simpler — sometimes two. Many things that require a lot of client-side code, a lot of requests or even server-side code you get for free when using JSON:API. That’s why we added it, of course :) See Dries’ overview if you haven’t already. It includes a great video that Gabe recorded that shows how it simplifies common needs. And of course, check out the spec!
datetime
&daterange
fields now respect standards #2926508They were always intended to respect standards, but didn’t.
For a field configured to store date + time:
"field_datetime":[{ "value": "2017-03-01T20:02:00",}]
⬇
"field_datetime":[{ "value": "2017-03-01T20:02:00+11:00",}]
The site’s timezone is now present! This is now a valid RFC3339 datetime string.
For a field configured to store date only:
"field_dateonly":[{ "value": "2017-03-01T20:02:00",}]
⬇
"field_dateonly":[{ "value": "2017-03-01",}]
Time information used to be present despite this being a date-only field! RFC3339 only covers combined date and time representations. For date-only representations, we need to use ISO 8601. There isn’t a particular name for this date-only format, so we have to hardcode the format. See https://en.wikipedia.org/wiki/ISO_8601#Calendar_dates.
Note: backward compatibility is retained: a datetime string without timezone information is still accepted. This is discouraged though, and deprecated: it will be removed for Drupal 9.
Previous Drupal 8 minor releases have fixed similar problems. But this one, for the first time ever, implements these improvements as a
@DataType
-level normalizer, rather than a@FieldType
-level normalizer. Perhaps that sounds too far into the weeds, but … it means it fixed this problem in bothrest.module
andjsonapi.module
! We want the entire ecosystem to follow this example.rest.module
has proven to be maintainable!In the previous update, I proudly declared that Drupal 8 core’s
rest.module
was in a “maintainable” state. I’m glad to say that has proven to be true: six months later, the number of open issues still fit on “a single page” (fewer than 50). :) So don’t worry as arest.module
user: we still triage the issue queue, it’s still maintained. But new features will primarily appear forjsonapi.module
.
Want more nuance and detail? See the REST: top priorities for Drupal 8.7.x issue on drupal.org.
Are you curious what we’re working on for Drupal 8.8? Want to follow along? Click the follow button at API-First: top priorities for Drupal 8.8.x — whenever things on the list are completed (or when the list gets longer), a comment gets posted. It’s the best way to follow along closely!1
Was this helpful? Let me know in the comments!
For reference, historical data:
- 8.2.x — results (25% of release notes issues)
- 8.3.x — results (10% of release notes issues)
- 8.4.x — results (14% of release notes issues)
- 8.5.x — results (25% of release notes issues, 25% of highlights)
- 8.6.x — results (14% of release notes issues, 18% of highlights)
- 8.7.x — results (10% of release notes issues, 23% of highlights)
-
~50 comments per six months — so very little noise. ↩︎