Я думаю, что это больше UI, чем API - то есть пользовательский интерфейс должен предварительно заполнить значения по умолчанию в соответствующих полях формы для пользователя, который затем просто заполнит пробелы и настроит значения по умолчанию если необходимо. Однако это не везде применимо (например, когда у вас есть только API без бита UI).
Вы уже предложили некоторые варианты сами - они будут работать, однако, при условии, что вы можете получить доступ к существующим ресурсам как /resource/123
, оба варианта по крайней мере немного нарушат ваш URI. Я могу придумать три варианта того, как подойти к этому, последний (третий) может быть лучшим выбором.
Подход № 1
Лучшим подходом может быть имитация способа, которым трудоемкие задачи обычно выполняются в REST. Обычно у вас есть ресурс, к которому вы отправляете задачу, затем служба отвечает URI задачи, который вы можете использовать позже для проверки хода выполнения задачи. Мы можем адаптировать его к нашему случаю - определить пустые ресурсы со значениями по умолчанию как новый ресурс, который мы можем использовать, чтобы получить «шаблон» для другого ресурса .
Пример:
Предполагая, что вы хотите получить шаблон для ресурса под названием «пользователь». Сначала необходимо выполнить запрос POST к ресурсу шаблона и указать тип ресурса, для которого вы хотите создать «шаблон»:
POST /template/
<?xml version="1.0" encoding="UTF-8" ?>
<template>
<type>user</type>
</template>
API создаст новый ресурс "по умолчанию" для указанного типа, в случае успеха он ответит:
HTTP/1.1 204 No Content
Location /user/123
Местоположение, указанное в ответе вашего API, будет содержать шаблон для ресурса:
GET /user/123
<?xml version="1.0" encoding="UTF-8" ?>
<user>
<id>123</id>
<name />
<email />
<preferred-language>en</preferred-language>
<timezone>UTC</timezone>
...
</user>
Подход № 2
Подход № 1 уже создает ресурс для вас. Альтернативный подход заключается в предоставлении пользователям доступа к шаблонам для определенного URI.
Пример:
GET /template/user
<?xml version="1.0" encoding="UTF-8" ?>
<user>
<name />
<email />
<preferred-language>en</preferred-language>
<timezone>UTC</timezone>
...
</user>
Подход № 3
Есть еще одна альтернатива - я считаю, что это самый простой и логичный подход, но он может не подходить для всех случаев. Вы можете создать пустой ресурс со значениями по умолчанию, выполнив запрос POST непосредственно к ресурсу, с которым вы хотите работать. Одним из недостатков может быть то, что это не позволит пользователям просто просматривать шаблон (что они могли бы сделать в подходе № 1), оно всегда будет создавать для них ресурс (аналогично подходу № 1).
Пример:
Чтобы получить версию ресурса по умолчанию, вы должны отправить пустой POST-запрос этому ресурсу:
POST /user/
API создаст новый ресурс со значениями по умолчанию и ответит:
HTTP/1.1 204 No Content
Location /user/123
То же, что и в подходе № 1, URI позволит пользователю получить созданный ресурс и затем изменить его при необходимости (через PUT):
GET /user/123
<?xml version="1.0" encoding="UTF-8" ?>
<user>
<id>123</id>
<name />
<email />
<preferred-language>en</preferred-language>
<timezone>UTC</timezone>
...
</user>