Ответ 1
Короткий ответ заключается в том, что никто не говорит о веб-сайтах RESTful, поскольку сайты по умолчанию RESTful. Вам действительно нужно попытаться создать веб-сайт без RESTful (хотя это было сделано - см. Ниже).
В настройке, которую вы описываете, требуется множество элементов из REST, но это не "REST" как таковое: это набор соглашений, предназначенных для удобства программистов на стороне сервера. Большинство современных веб-интерфейсов используют только подмножество ограничений REST, а это подмножество, которое не включает основной принцип управления сайтами.
Позвольте мне немного подружиться. Здесь, какие веб-сайты и веб-API имеют общий характер: они оба раскрывают функциональность через ресурсы. Каждый ресурс идентифицируется URL-адресом, и каждый из них отвечает на соответствующее подмножество стандартных HTTP-методов. (Это может показаться очевидным, но посмотрите на XML-RPC или SOAP, где есть только один URL-адрес для всей системы.) Ресурс может отправлять документы клиенту (в ответ на запрос GET) и/или он может принимать документы из клиент (вместе с запросом POST или PUT).
Теперь, различия. Веб-API часто отображают четыре наиболее распространенных метода HTTP (POST, GET, PUT, DELETE) на четыре операции CRUD (создание, чтение, обновление, удаление). Веб-сайты не могут этого сделать, потому что веб-сайты работают на HTML, а HTML-формы поддерживают только два метода: GET и POST. И все же веб-сайт может легко описать все виды действий - "поиск", "следующая страница", "покупка", "недружество" - которые нетривиальны для отображения на CRUD.
Это потому, что HTML поддерживает ссылки и формы. Это то, что отсутствует в ветке "Веб-API" генеалогического древа. Не ресурсы, а машиночитаемые соединения между ресурсами. (Чтобы удалить некоторый жаргон REST, это "ограничение гипермедиа" или "гипермедиа как двигатель состояния приложения".)
"Веб-API" , как правило, игнорируют ограничение гипермедиа, потому что а) это трудно понять, и б) JSON не поддерживает ссылки или формы, поэтому трудно подчиниться гипермедийному ограничению, даже если вы этого хотите. (Это меняется с развитием таких форматов, как JSON-LD, Hydra и HAL.)
Но ограничение гипермедиа - это буквально то, что удерживает Сеть вместе. Уберите ссылки и формы, и вы останетесь с неиспользуемым беспорядком.
Python Challenge - хороший пример веб-сайта, не принадлежащего RESTful. Вы получаете стартовый URL, а затем вам нужно решить небольшую загадку, чтобы выяснить, как добраться до следующего URL-адреса в последовательности. У вас все еще есть ресурсы, и каждый ресурс имеет URL-адрес. Но связи между ресурсами скрыты. Это весело, как игра, но никто не будет запускать серьезный сайт таким образом. К сожалению, это своего рода то, что мы имеем в виду "Веб-API" .
Дальнейшее чтение
Как вы можете сказать, это сложная тема. Рискуя сделать свой собственный рог, "модель зрелости" , которую я разработал для разговора 2008 года, может помочь вам понять архитектурное различие между Всемирной паутиной (уровень 3) и большинство современных API (уровень 2). Я также рекомендовал Steve Klabnik Проектирование API Hypermedia и собственный RESTful Web API, который начинается с сравнивая веб-API с веб-сайтом, который делает то же самое.
Моя предыдущая книга RESTful Web Services также охватывает эту тему, и она бесплатна для чтения в Интернете. Однако он несколько устарел (он был опубликован в 2007 году), и в ретроспективе я не думаю, что он достаточно сильно подталкивает угол гипермедиа.
Разное
Чтобы кратко ответить на несколько второстепенных вопросов из вашего первоначального вопроса:
-
Существует нет технической разницы между веб-API и веб-сайтом. Веб-сайт - это веб-API, который служит для работы с документами HTML.
-
Один URL-адрес не более "RESTful", чем другой. Это исключительно вопрос удобства использования. На техническом уровне совсем не имеет значения, как выглядят ваши URL-адреса.
/users/login.json
и/login
и/the-first-100-prime-numbers.gif
- все равно RESTful способы ссылаться на форму входа. -
Домашняя страница - это ресурс: это ресурс "домашней страницы". Его задача состоит в том, чтобы содержать самые важные биты информации и направлять клиента на другие страницы - либо напрямую через ссылки, либо косвенно через форму поиска. Ресурс не обязательно соответствует строке в базе данных или объекту в объектной модели. Ресурс может быть абсолютно любым, даже реальным объектом или абстрактным понятием. Единственное ограничение заключается в том, что ресурс должен иметь URL-адрес.
-
/login
- это URL, поэтому да, он идентифицирует ресурс. Какой ресурс? Если это типичный сценарий, в котором при отправке "GET/login" вы получаете HTML-страницу с формой входа в систему, то это ресурс "входа в систему". Если заполнение формы входа запускает запрос "POST/login", он также действует как "процессор формы входа".
Возможно, вам удастся подумать о ресурсе с точки зрения кода, который запускается, когда приходит запрос на его URL, вместо того, чтобы пытаться сопоставить его с одной конкретной "вещью" в вашем наборе данных. То есть вместо того, чтобы пытаться выяснить, что такое ресурс, подумайте об этом с точки зрения того, что он делает.
Надеюсь, что это поможет.