REST API против Web API - PullRequest
       9

REST API против Web API

1 голос
/ 02 апреля 2019

Я новичок в создании HTTP API, и мне кажется, что я не совсем понимаю разницу между REST API и Web API. Больше я читаю об этом в Интернете, путаница, кажется, накапливается. Я думаю, что Филдинг имеет ту же проблему, что и по этой ссылке http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven

Я создал HTTP API на работе, думая, что я создал REST API, поскольку везде, где я читаю, они создавали Web / HTTP API и называли его REST.

Когда я обнаружил, что один API-интерфейс соответствует принципу HATEOAS, это был один Github REST API https://api.github.com. Я попытался использовать его для своего имени пользователя в Github (GET https://api.github.com/users/vvs14),, он вернул все связанные ссылки по принципу HATEOAS .

Это один из лучших реальных API, который близок к спецификации REST, IMHO. Хотя я не мог понять, какой URI поддерживает какую операцию над ним и как найти его в случае использования любого REST API, если я его использую, или как сообщить об этом потребителю, если я размещаю API?

Один хороший блог об этом https://www.e4developer.com/2018/02/16/hateoas-simple-explanation/.

Все остальные примеры приведены в большинстве блогов, просто говорится, что JSON должен быть API-интерфейсом REST, а Ресурс - API-интерфейс REST, а глаголы HTTP для операций CRUD - API-интерфейс REST. Я не считаю, что это правда.

На своей работе я использую веб-API Sendgrid для отправки электронных писем клиентам, и они называют его веб-API, а не REST, что я считаю довольно правдоподобным.

Может кто-нибудь прояснить разницу между этими двумя примерами?

Если Github API является правильным примером REST API, как мы можем узнать, какой URI поддерживает, какие операции в качестве типа носителя здесь не упоминаются?

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Вы правы, здесь много путаницы. Эксперты обычно ссылаются на «настоящие» REST API как на HATEOAS или API, управляемые гипермедиа, чтобы избежать этой путаницы. Большинство API, которые do называют себя REST API, обычно не являются.

Поэтому, когда вы разговариваете с другими инженерами о REST API, полезно сначала уточнить, что все считают REST, а не REST. Они не плохие инженеры, потому что не знают, что термин «ОТДЫХ» просто обрел собственную жизнь, и я бы сказал, что HATEOAS, вероятно, намного больше нишевого навыка.

Я согласен с ответом Николаса Шэнка о том, что во многих случаях универсальная вещь, которую нужно выяснить, если, например, DELETE работает, это фактически выпустить DELETE и посмотреть, сработает ли это впоследствии.

Это не всегда полезно, потому что многие люди, создающие API, захотят не показывать кнопку «удалить», если она все равно не будет работать.

Итак, что является разумным способом сообщить клиенту, что DELETE доступен? Стандарт HTTP на самом деле имеет заголовок Allow , который вы можете использовать, чтобы узнать, какие методы работают на данной конечной точке. Чтобы узнать, что это такое, вы можете отправить запрос OPTIONS. Не все фреймворки поддерживают это из коробки, но это законный способ сделать это.

Другой способ сообщить клиенту заранее - встроить эту информацию в ресурс, к которому вы обращаетесь. Пара примеров:

  1. ссылка на подсказку - это черновой стандарт Интернета, который может давать эти советы в самых разных местах, таких как HAL, заголовок HTTP Link или другие. Это в основном предлагает универсальный формат для этой информации.
  2. Если вы используете что-то вроде OpenAPI, вы можете добавить к своей спецификации API, какие методы будут и не будут работать. Это может хорошо работать в тех случаях, когда вы знаете, что DELETE просто никогда не будет работать, но это не очень поможет вам в тех случаях, когда разные пользователи могут иметь разные уровни доступа, и некоторые люди могут использовать DELETE, а другие могут «т.
  3. Вы можете встраивать эту информацию в свой собственный формат, выражая ее как набор разрешений, возможно, в формате JSON, который ваше приложение понимает для интерпретации возможности выполнения определенных действий.
  4. Некоторые форматы HATEAOS явно содержат информацию о том, какие действия могут быть выполнены с помощью действий. Отличным примером является формат SIREN . HAL изначально не имеет этого.

В конечном счете, хороший формат HATEAOS не только вернет информацию о ресурсе и отношениях с другими, но также предоставит ряд возможных действий, которые можно предпринять. Большинство API REST, которые являются HATEAOS, обычно этого не делают, но HTML - лучший пример того, что делает. Если нет ссылки, кнопки или формы для выполнения действия, пользователь не может обнаружить это действие.

Пример ссылки-подсказки, встроенный в HAL

{
  "_links": {
    "self": {
      "href": "/orders/523",
      "hints": {
        "allow": ["GET", "DELETE"],
      }
    }
  }
}

Пример сирены

 {
  "class": [ "order" ],
  "properties": { 
      "orderNumber": 523, 
  },
  "actions": [
    {
      "name": "delete-order",
      "title": "Delete Order",
      "method": "DELETE",
      "href": "/orders/523",
    }
  ],
  "links": [
    { "rel": [ "self" ], "href": "/orders/523" },
  ]
}

ВАРИАНТ ОТВЕТА

HTTP/1.1 200 OK
Allow: GET, DELETE
1 голос
/ 02 апреля 2019

Единственный ресурс, который может сказать вам, что он поддерживает, это сам ресурс.Любая информация, которую ресурс дает вам о поддержке других ресурсов, носит исключительно рекомендательный характер.Единственный верный способ выяснить это - попробовать и справиться с успехом / неудачей.Это связано с тем, что принятые запросы могут поменяться поминутно (например, удалить).

Если ваш API может быть ориентирован на навигацию и формы могут быть отправлены в веб-браузере - клиент, который ничего не знает о вашем API, кроменачальный URL и формат HTML - и если предположить, что text / html является оборотным представлением вашего API, то это RESTful.Это может быть RESTful, даже если в браузере нет навигации, но это труднее продемонстрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...