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

Укажите IP-адрес вашей системы, имеющей интернет в URL-адресе. например: 190.168.1.90 это работает для меня

3883
задан MD XF 16 March 2017 в 19:47
поделиться

7 ответов

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

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

68
ответ дан Hank Gay 17 March 2017 в 05:47
поделиться

Я вижу набор ответов, в которых говорится, что помещение всего о пользователе 123 в ресурсе "/user/123" УСПОКОИТЕЛЬНОЕ.

Roy Fielding, который ввел термин, говорит , API REST должны управляться гипертекстом . В частности, "API REST не должен определять зафиксированные имена ресурса или иерархии".

Поэтому, если Ваш путь "/user/123" является hardcoded на клиенте, это не ДЕЙСТВИТЕЛЬНО УСПОКОИТЕЛЬНО. Хорошее использование HTTP, возможно, возможно, нет. Но не УСПОКОИТЕЛЬНЫЙ. Это должно прибыть из гипертекста.

33
ответ дан Ken 17 March 2017 в 05:47
поделиться

REST использует различные методы HTTP (главным образом ДОБИРАЮТСЯ/ПОМЕЩАЮТ/УДАЛЯЮТ) управлять данными.

Вместо того, чтобы использовать определенный URL для удаления метода (говорят, /user/123/delete), Вы отправили бы УДАЛИТЬ запрос к /user/[id] URL, чтобы отредактировать пользователя, получить информацию о пользователе, Вы отправляете ПОЛУЧИТЬ запрос к /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
88
ответ дан dbr 17 March 2017 в 05:47
поделиться

УСПОКОИТЕЛЬНОЕ программирование о:

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

последний является, вероятно, самым важным с точки зрения последствий и полной эффективности REST. В целом, большинство УСПОКОИТЕЛЬНЫХ обсуждений, кажется, центрируется на HTTP и его использовании от браузера и что нет. Я понимаю это R. Fielding ввел термин, когда он описал архитектуру и решения тот вывод к HTTP. Его тезис больше об архитектуре и способности кэша ресурсов, чем это о HTTP.

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

я думаю, что самый важный прием к пониманию архитектурной важности и последствий производительности УСПОКОИТЕЛЬНОГО и Совместно использованный Ничто архитектура не должно стараться не становиться одержимым деталями реализации и технологией. Концентрат на том, кто владеет ресурсами, кто ответственен за создание/поддержание их, и т.д. Тогда думает о представлениях, протоколах и технологиях.

526
ответ дан Espen 17 March 2017 в 05:47
поделиться

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

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

Так, как это относится HTTP, и как он может быть реализован на практике? HTTP ориентирован вокруг глаголов и ресурсов. Эти два глагола в основном использовании GET и POST, который я думаю, что все распознают. Однако стандарт HTTP определяет несколько других такой как [1 110] и DELETE. Эти глаголы тогда применяются к ресурсам, согласно инструкциям, предоставленным сервером.

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

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"
        }
    ]
}

Мы знаем из описания наших медиа, что можем найти информацию о связанных ресурсах от разделов названной "ссылками". Это называют средства управления Гиперсредой . В этом случае мы можем сказать от такого раздела, что можем найти список пользователей путем выполнения другого запроса для [1 116]:

Запрос

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"
        }
    ]
}

Мы можем сказать много от этого ответа. Например, мы теперь знаем, что можем создать нового пользователя [1 117] луг к [1 118]:

Запрос

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 обычно реализовывался несколько лет назад, когда я сначала записал это, а не его истинное значение. Я пересмотрел ответ для лучше представления реального значения.)

2892
ответ дан 22 revs, 15 users 88% 17 March 2017 в 05:47
поделиться

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

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

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

И еще лучше, существует чистое объяснение с простыми примерами здесь (powerpoint является более всесторонним, но можно получить максимум от него в версии HTML):

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

После чтения примеров я видел, почему Ken говорит, что REST управляется гипертекстом. Я не на самом деле уверен, что он прав, хотя, потому что это/user/123 является URI, который указывает на ресурс, и мне не ясно, что это неуспокоительно просто, потому что клиент знает об этом "внеполосный".

Это xfront документ объясняет различие между REST и SOAP, и это действительно полезно также. Когда Fielding говорит, "Это - RPC. Это кричит RPC". ясно, что RPC не является УСПОКОИТЕЛЬНЫМ, таким образом, полезно видеть точные основания для этого. (SOAP является типом RPC.)

45
ответ дан 17 December 2019 в 16:00
поделиться

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

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

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
405
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: