Что такое RESTful-программирование? - PullRequest
3848 голосов
/ 22 марта 2009

Что такое RESTful-программирование?

Ответы [ 32 ]

2874 голосов
/ 22 марта 2009

REST - основной архитектурный принцип сети. Удивительным моментом в Интернете является тот факт, что клиенты (браузеры) и серверы могут взаимодействовать сложным образом, и клиент ничего не знает заранее о сервере и размещенных на нем ресурсах. Ключевым ограничением является то, что сервер и клиент должны согласовать используемое media , которое в случае с Интернетом равно HTML .

API, который придерживается принципов REST , не требует от клиента ничего знать о структуре API. Скорее, сервер должен предоставить любую информацию, необходимую клиенту для взаимодействия со службой. HTML-форма является примером этого: сервер указывает местоположение ресурса и обязательные поля. Браузер заранее не знает, куда отправлять информацию, и заранее не знает, какую информацию отправлять. Обе формы информации полностью предоставляются сервером. (Этот принцип называется HATEOAS : гипермедиа как двигатель состояния приложения .)

Итак, как это относится к HTTP и как его можно реализовать на практике? HTTP ориентируется на глаголы и ресурсы. В основном употреблении используются два глагола: GET и POST, которые, я думаю, все узнают. Тем не менее, стандарт HTTP определяет несколько других, таких как PUT и DELETE. Затем эти глаголы применяются к ресурсам в соответствии с инструкциями, предоставленными сервером.

Например, давайте представим, что у нас есть пользовательская база данных, которая управляется веб-службой. Наш сервис использует пользовательские гипермедиа на основе JSON, для которых мы назначаем mimetype application/json+userdb (также могут быть application/xml+userdb и application/whatever+userdb - могут поддерживаться многие типы медиа). Клиент и сервер были запрограммированы для понимания этого формата, но они ничего не знают друг о друге. Как Рой Филдинг указывает:

API REST должен тратить почти все свои описательные усилия на определение типа (ов) медиа, используемых для представления ресурсов и управления ими состояние приложения или при определении расширенных имен отношений и / или разметка с поддержкой гипертекста для существующих стандартных типов носителей.

Запрос на базовый ресурс / может вернуть что-то вроде этого:

Запрос

GET /
Accept: application/json+userdb

Ответ

200 OK
Content-Type: application/json+userdb

{
    "version": "1.0",
    "links": [
        {
            "href": "/user",
            "rel": "list",
            "method": "GET"
        },
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Мы знаем из описания наших СМИ, что мы можем найти информацию о связанных ресурсах в разделах, называемых «ссылками». Это называется Гипермедиа управления . В этом случае мы можем сказать из такого раздела, что мы можем найти список пользователей, сделав еще один запрос для /user:

Запрос

GET /user
Accept: application/json+userdb

Ответ

200 OK
Content-Type: application/json+userdb

{
    "users": [
        {
            "id": 1,
            "name": "Emil",
            "country: "Sweden",
            "links": [
                {
                    "href": "/user/1",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/1",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/1",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        },
        {
            "id": 2,
            "name": "Adam",
            "country: "Scotland",
            "links": [
                {
                    "href": "/user/2",
                    "rel": "self",
                    "method": "GET"
                },
                {
                    "href": "/user/2",
                    "rel": "edit",
                    "method": "PUT"
                },
                {
                    "href": "/user/2",
                    "rel": "delete",
                    "method": "DELETE"
                }
            ]
        }
    ],
    "links": [
        {
            "href": "/user",
            "rel": "create",
            "method": "POST"
        }
    ]
}

Мы можем многое сказать по этому ответу. Например, теперь мы знаем, что можем создать нового пользователя путем POST в /user:

Запрос

POST /user
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Karl",
    "country": "Austria"
}

Ответ

201 Created
Content-Type: application/json+userdb

{
    "user": {
        "id": 3,
        "name": "Karl",
        "country": "Austria",
        "links": [
            {
                "href": "/user/3",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/3",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/3",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

Мы также знаем, что можем изменить существующие данные:

Запрос

PUT /user/1
Accept: application/json+userdb
Content-Type: application/json+userdb

{
    "name": "Emil",
    "country": "Bhutan"
}

Ответ

200 OK
Content-Type: application/json+userdb

{
    "user": {
        "id": 1,
        "name": "Emil",
        "country": "Bhutan",
        "links": [
            {
                "href": "/user/1",
                "rel": "self",
                "method": "GET"
            },
            {
                "href": "/user/1",
                "rel": "edit",
                "method": "PUT"
            },
            {
                "href": "/user/1",
                "rel": "delete",
                "method": "DELETE"
            }
        ]
    },
    "links": {
       "href": "/user",
       "rel": "list",
       "method": "GET"
    }
}

Обратите внимание, что мы используем различные глаголы HTTP (GET, PUT, POST, DELETE и т. Д.) Для манипулирования этими ресурсами, и что единственное знание, которое мы предполагаем со стороны клиента, - это наше определение медиа .

Дополнительное чтение:

(Этот ответ был предметом значительной критики за то, что он упустил суть. По большей части это была справедливая критика. То, что я первоначально описал, больше соответствовало тому, как REST обычно применялся в течение нескольких лет. назад, когда я впервые написал это, а не его истинное значение. Я изменил ответ, чтобы лучше представить реальное значение.)

665 голосов
/ 15 апреля 2015

Архитектурный стиль , называемый REST (Передача состояния представления) , рекомендует веб-приложениям использовать HTTP, как это было , изначально предполагалось . Поиски должны использовать GET запросов. PUT, POST и DELETE запросы должны использоваться для мутации, создания и удаления соответственно .

Сторонники REST предпочитают URL-адреса, например

http://myserver.com/catalog/item/1729

но архитектура REST не требует этих "красивых URL". GET-запрос с параметром

http://myserver.com/catalog?item=1729

каждый бит как RESTful.

Имейте в виду, что запросы GET никогда не должны использоваться для обновления информации. Например, запрос GET для добавления товара в корзину

http://myserver.com/addToCart?cart=314159&item=1729

не подходит. GET-запросы должны быть идемпотентными . То есть выдача запроса дважды не должна отличаться от выдачи его один раз. Вот что делает запросы кешируемыми. Запрос «добавить в корзину» не идемпотентен - при его повторном добавлении в корзину добавляется две копии элемента. Запрос POST явно уместен в этом контексте. Таким образом, даже веб-приложению RESTful нужна доля запросов POST.

Это взято из превосходной книги Core JavaServer face книга Дэвида М. Гири.

524 голосов
/ 22 марта 2009

RESTful программирование о:

  • ресурсы, идентифицируемые постоянным идентификатором: URI - это повсеместный выбор идентификатора в наши дни
  • ресурсы, которыми манипулируют с помощью общего набора глаголов: чаще всего встречаются HTTP-методы - почтенный Create, Retrieve, Update, Delete становится POST, GET, PUT и DELETE. Но REST не ограничивается HTTP, это просто наиболее часто используемый транспорт на данный момент.
  • фактическое представление, полученное для ресурса, зависит от запроса, а не от идентификатора: используйте заголовки Accept для управления тем, хотите ли вы XML, HTTP или даже объект Java, представляющий ресурс
  • поддержание состояния в объекте и представление состояния в представлении
  • представляет отношения между ресурсами в представлении ресурса: ссылки между объектами встроены непосредственно в представление
  • Представления ресурсов описывают, как представление можно использовать и при каких обстоятельствах его следует последовательно отбрасывать / повторно: использование заголовков HTTP Cache-Control

Последний, вероятно, является наиболее важным с точки зрения последствий и общей эффективности REST. В целом, большинство обсуждений RESTful, похоже, сосредоточены на HTTP и его использовании из браузера, а что нет. Я понимаю, что Р. Филдинг придумал термин, когда он описал архитектуру и решения, которые приводят к HTTP. Его тезис больше посвящен архитектуре и способности кеширования ресурсов, чем HTTP.

Если вас действительно интересует, что такое архитектура RESTful и почему она работает, прочитайте его тезис несколько раз и прочитайте все , а не только главу 5! Далее рассмотрим , почему DNS работает . Прочитайте об иерархической организации DNS и о том, как работают рефералы. Затем прочитайте и рассмотрите, как работает DNS-кэширование. Наконец, прочтите спецификации HTTP (в частности, RFC2616 и RFC3040 ) и рассмотрите, как и почему кэширование работает так, как оно работает. В конце концов, он просто щелкнет. Последнее откровение для меня было, когда я увидел сходство между DNS и HTTP. После этого, понимание того, почему SOA и интерфейсы передачи сообщений являются масштабируемыми, начинает щелкать.

Я думаю, что самый важный трюк для понимания важности архитектуры и влияния производительности на архитектуры RESTful и Shared Nothing - это не зацикливаться на деталях технологии и реализации. Сконцентрируйтесь на том, кому принадлежат ресурсы, кто отвечает за их создание / обслуживание и т. Д. Затем подумайте о представлениях, протоколах и технологиях.

404 голосов
/ 04 июля 2009

Вот как это может выглядеть.

Создать пользователя с тремя свойствами:

POST /user
fname=John&lname=Doe&age=25

Сервер отвечает:

200 OK
Location: /user/123

В дальнейшем вы можете получить информацию о пользователе:

GET /user/123

Сервер отвечает:

200 OK
<fname>John</fname><lname>Doe</lname><age>25</age>

Чтобы изменить запись (lname и age останутся без изменений):

PATCH /user/123
fname=Johnny

Чтобы обновить запись (и, следовательно, lname и age будут иметь значение NULL):

PUT /user/123
fname=Johnny
178 голосов
/ 17 октября 2010

Великая книга о ОТДЫХЕ ОТДЫХ на практике .

Должны быть прочитаны Передача репрезентативного состояния (REST) ​​ и API REST должны управляться гипертекстом

См. Статью Мартина Фаулерса Модель зрелости Ричардсона (RMM) для объяснения того, что такое служба RESTful.

Richardson Maturity Model

Чтобы быть RESTful, Служба должна удовлетворять требованиям Гипермедиа как Механизма Состояния Приложения. (HATEOAS) , то есть он должен достичь уровня 3 в RMM, прочитать статью для получения подробной информации или слайды из разговора qcon .

Ограничение HATEOAS является аббревиатурой для гипермедиа как двигатель Состояние приложения. Этот принцип ключевое различие между ОТДЫХОМ и большинство других форм клиент-сервера система.

...

Требуется клиент приложения RESTful знать только один фиксированный URL для доступа Это. Все будущие действия должны быть обнаруживается динамически из гиперссылки включены в представления ресурсов, которые возвращаются с этого URL. Стандартные типы носителей также ожидается, что будет понято любым клиент, который может использовать RESTful API. (Из Википедии, свободной энциклопедии)

REST Litmus Test для веб-фреймворков - аналогичный тест на зрелость для веб-фреймворков.

Приближаемся к чистому ОТДЫХУ: Учимся любить HATEOAS - хорошая коллекция ссылок.

REST против SOAP для публичного облака обсуждает текущие уровни использования REST.

REST и управление версиями обсуждаются возможности расширения, управления версиями, развития и т. Д. через модифицируемость

133 голосов
/ 19 ноября 2012

Что такое ОТДЫХ?

REST означает Передача представительского состояния. (Иногда пишется "ReST".) Он опирается на клиент-сервер без сохранения состояния, кешируется протокол связи - и практически во всех случаях HTTP протокол используется.

REST - это стиль архитектуры для проектирования сетевых приложений. Идея заключается в том, что вместо использования сложных механизмов, таких как CORBA, RPC или SOAP для соединения между машинами, простой HTTP используется для звонки между машинами.

Во многих отношениях можно просматривать саму всемирную сеть, основанную на HTTP. как основанная на REST архитектура. Приложения RESTful используют HTTP-запросы размещать данные (создавать и / или обновлять), читать данные (например, делать запросы), и удалить данные. Таким образом, REST использует HTTP для всех четырех CRUD Операции (создание / чтение / обновление / удаление).

REST - это легкая альтернатива таким механизмам, как RPC (Remote Вызовы процедур) и веб-сервисы (SOAP, WSDL и др.). Позже мы будем посмотрим, насколько проще REST.

Несмотря на простоту, REST является полнофункциональным; там в основном ничего, что вы не можете сделать в веб-сервисах, что нельзя сделать с помощью RESTful архитектура. ОТДЫХ не является «стандартом». Там никогда не будет W3C например, рекомендация для ОТДЫХА. И пока есть ОТДЫХ рамки программирования, работа с REST настолько проста, что вы можете часто "катайся сам" со стандартными функциями библиотеки на таких языках Perl, Java или C #.

Одна из лучших ссылок, которую я нашел, когда я пытался найти простое реальное значение отдыха.

http://rest.elkstein.org/

88 голосов
/ 22 марта 2009

REST использует различные методы HTTP (в основном, GET / PUT / DELETE) для манипулирования данными.

Вместо того, чтобы использовать определенный URL для удаления метода (скажем, /user/123/delete), вы бы отправили запрос DELETE на URL /user/[id], чтобы отредактировать пользователя, чтобы получить информацию о пользователе, которого вы отправили GET-запросом. до /user/[id]

Например, вместо этого набор URL, который может выглядеть следующим образом:

GET /delete_user.x?id=123
GET /user/delete
GET /new_user.x
GET /user/new
GET /user?id=1
GET /user/id/1

Вы используете HTTP "глаголы" и имеете ..

GET /user/2
DELETE /user/2
PUT /user
67 голосов
/ 22 марта 2009

Это программирование, в котором архитектура вашей системы соответствует REST-стилю , изложенному Роем Филдингом в его диссертации . Поскольку это архитектурный стиль, который описывает сеть (более или менее), многие люди заинтересованы в этом.

Бонусный ответ: Нет. Если вы не изучаете архитектуру программного обеспечения как академическое или не разрабатываете веб-сервисы, нет никаких оснований слышать этот термин.

45 голосов
/ 12 июля 2013

Я бы сказал, что в программировании RESTful речь идет о создании систем (API), соответствующих архитектурному стилю REST.

Я нашел этот фантастический, короткий и легкий для понимания урок о REST доктора М. Элькштейна и процитировал основную часть, которая ответила бы на ваш вопрос по большей части:

Learn REST: учебное пособие

REST - это архитектурный стиль для проектирования сетевых приложений. Идея заключается в том, что вместо использования сложных механизмов, таких как CORBA, RPC или SOAP для соединения между машинами, простой HTTP используется для звонки между машинами.

  • Во многих отношениях саму World Wide Web, основанную на HTTP, можно рассматривать как архитектуру на основе REST.

Приложения RESTful используют HTTP-запросы для публикации данных (создания и / или обновить), прочитать данные (например, сделать запросы) и удалить данные. Таким образом, ОТДЫХ использует HTTP для всех четырех операций CRUD (создание / чтение / обновление / удаление).

Не думаю, что вы должны чувствовать себя глупо, если не слышите о REST вне переполнения стека ..., я бы попал в ту же ситуацию !; ответы на этот другой SO вопрос на Почему REST становится большим может ослабить некоторые чувства.

45 голосов
/ 23 марта 2009

Я прошу прощения, если я не отвечаю на вопрос напрямую, но это легче понять с помощью более подробных примеров. Филдинг нелегко понять из-за всей абстракции и терминологии.

Здесь есть довольно хороший пример:

Объяснение REST и гипертекста: Spam-E - робот для очистки от спама

И, что еще лучше, здесь есть простое объяснение с простыми примерами (PowerPoint более полный, но вы можете получить большую его часть в html-версии):

http://www.xfront.com/REST.ppt или http://www.xfront.com/REST.html

Прочитав примеры, я понял, почему Кен говорит, что REST управляется гипертекстом. На самом деле я не уверен, что он прав, потому что / user / 123 - это URI, который указывает на ресурс, и мне не ясно, что он НЕПРАВИЛЬНЫЙ, просто потому что клиент знает об этом «вне диапазона».

Этот документ xfront объясняет разницу между REST и SOAP, и это тоже очень полезно. Когда Филдинг говорит: « Это RPC. Он кричит RPC. », становится ясно, что RPC не RESTful, поэтому полезно выяснить точные причины этого. (SOAP - это тип RPC.)

...