Протокол

Ниже приведена подробная спецификация протокола Inertia. Сначала ознакомьтесь со страницей как это работает для получения общего представление.

HTML-ответы

Самый первый запрос к приложению Inertia - это обычный полнофункциональный запрос браузера без специальных заголовков или данных Inertia. Для этих запросов сервер возвращает полный HTML-документ.

Этот HTML-ответ включает ресурсы сайта (CSS, JavaScript), а также корневой элемент <div> в теле. Корневой элемент <div> служит точкой монтирования для клиентского приложения и включает атрибут data-page с закодированным в JSON объект страницы для начальной страницы. Inertia использует эту информацию для загрузки Вашей клиентской среды и отображения компонента начальной страницы.

Request
GET: http://example.com/events/80
Accept: text/html, application/xhtml+xml
Response
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
<html>
<head>
    <title>Мое приложение</title>
    <link href="/css/app.css" rel="stylesheet">
    <script src="/js/app.js" defer></script>
</head>
<body>

<div id="app" data-page='{"component":"Event","props":{"event":{"id":80,"title":"День рождения","start_date":"2019-06-02","description":"Выходите и отпразднуйте 36-летие Джонатана!"}},"url":"/events/80","version":"c32b8e4965f418ad16eaebba1d4e960f"}'></div>

</body>
</html>
Хотя первоначальным ответом является HTML, Inertia не отображает компоненты страницы JavaScript на стороне сервера.

Inertia-ответы

После загрузки приложения Inertia все последующие запросы к сайту выполняются через XHR со специальным заголовком X-Inertia, установленным в значение true. Этот заголовок указывает, что запрос выполняет Inertia, а не стандартным посещением полной страницы.

Когда сервер обнаруживает заголовок X-Inertia, вместо ответа полным HTML-документом он возвращает ответ JSON с закодированным объектом страницы.

Request
GET: http://example.com/events/80
Accept: text/html, application/xhtml+xml
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5
Response
HTTP/1.1 200 OK
Content-Type: application/json
Vary: Accept
X-Inertia: true
{
  "component": "Event",
  "props": {
    "event": {
      "id": 80,
      "title": "День рождения",
      "start_date": "2019-06-02",
      "description": "Выходите и отпразднуйте 36-летие Джонатана!"
    }
  },
  "url": "/events/80",
  "version": "c32b8e4965f418ad16eaebba1d4e960f"
}

Объект страницы

Inertia обменивается данными между сервером и клиентом через объект страницы. Этот объект включает в себя необходимую информацию, необходимую для визуализации компонента страницы, обновления состояния истории и отслеживания версии ресурса сайта. Объект страницы включает следующие четыре свойства:

  1. component: Имя компонента страницы JavaScript.
  2. props: Свойства страницы (данные).
  3. url: URL-адрес страницы.
  4. version: Текущая версия актива.

При стандартных посещениях полной страницы объект страницы кодируется в формате JSON в атрибуте data-page в корневом каталоге <div>. При посещении Inertia объект страницы возвращается в качестве полезной нагрузки JSON.

Версионность ресурса

Одна из распространенных проблем с одностраничными приложениями - обновление ресурсов сайта, когда они были изменены. Inertia упрощает это за счет необязательного отслеживания текущей версии актива сайта. В случае изменения актива Inertia автоматически выполнит жесткое (полное) посещение страницы вместо посещения XHR.

В объект страницы включен идентификатор версии version. Этот идентификатор версии устанавливается на стороне сервера и может быть числом, строкой, хешем файла и т. д. Это не имеет значения, если оно изменится при обновлении ресурсов сайта.

Всякий раз, когда делается запрос Inertia, она включает текущую версию актива в заголовок X-Inertia-Version. Когда сервер получает запрос, он сравнивает версию актива, представленную в заголовке X-Inertia-Version, с текущей версией актива. Обычно это обрабатывается в промежуточном программном обеспечении.

Если версии ресурсов совпадают, запрос просто продолжается, как и ожидалось. Однако, если они отличаются, сервер немедленно возвращает ответ 409 Conflict и включает URL-адрес в заголовок X-Inertia-Location. Этот заголовок необходим, поскольку могло произойти перенаправление на стороне сервера. Это сообщает Inertia окончательный целевой URL-адрес.

Обратите внимание, что ответы 409 Conflict отправляются только для запросов GET, но не для запросов POST/PUT/PATCH/DELETE. Тем не менее, они будут отправлены в том случае, если после одного из этих запросов произойдет GET перенаправление.

Наконец, если данные мгновенного сеанса существуют, когда возникает ответ 409 Conflict, сервер автоматически переформатирует эти данные.

Request
GET: http://example.com/events/80
Accept: text/html, application/xhtml+xml
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5
Response
409: Conflict
X-Inertia-Location: http://example.com/events/80

Частичные перезагрузки

При выполнении запросов Inertia опция частичной перезагрузки позволяет запрашивать подмножество свойств (данных) с сервера при последующих посещениях того же компонента страницы. Это может быть полезным для оптимизации производительности, если допустимо, чтобы некоторые данные страницы устарели.

Когда делается запрос частичной перезагрузки, Inertia включает два дополнительных заголовка с запросом: X-Inertia-Partial-Data и X-Inertia-Partial-Component.

Заголовок X-Inertia-Partial-Data представляет собой разделенный запятыми список желаемых ключей свйоств (данных), которые должны быть возвращены.

Заголовок X-Inertia-Partial-Component включает имя компонента, который частично перезагружается. Это необходимо, поскольку частичная перезагрузка работает только для запросов, сделанных к тому же компоненту страницы. Если конечный пункт назначения отличается по какой-либо причине (например, пользователь вышел из системы и теперь находится на странице входа), то частичной перезагрузки не произойдет.

Request
GET: http://example.com/events
Accept: text/html, application/xhtml+xml
X-Requested-With: XMLHttpRequest
X-Inertia: true
X-Inertia-Version: 6b16b94d7c51cbe5b1fa42aac98241d5
X-Inertia-Partial-Data: events
X-Inertia-Partial-Component: Events
Response
HTTP/1.1 200 OK
Content-Type: application/json
{
  "component": "Events",
  "props": {
    "auth": {...},       // Не включено
    "categories": [...], // Не включено
    "events": [...]      // Включено
  },
  "url": "/events/80",
  "version": "c32b8e4965f418ad16eaebba1d4e960f"
}