Подтвердить что ты не робот

JSON Hypermedia Api с формами и ссылками

Я нахожусь на ранних стадиях планирования REST api, и я хотел бы, чтобы он придерживался ограничения HESTOAS REST. Но я также хотел бы предоставить формат JSON. Поэтому мой вопрос заключается в том, есть ли конвенции для представления ссылок и форм в JSON.

Я нашел примеры ссылок, и похоже, что это довольно распространенный способ представления ссылок:

"links": [ 
{"rel": "self", "href":"http://example.org/entity/1"},
{"rel": "friends", "href":"http://example.org/entity/1/friends"}] 

Представление форм, с другой стороны, не то, что я видел много. Я думал, что, возможно, кто-то сел и придумал что-то в этом роде, но рассмотрел все предостережения:

"forms" : [
{"rel" : "new client", "action" : "/clients", "method": "post", 
"fields" : ["name":"string", "zipcode":"int", "signedup":"date", "state": ["Alabama",...]...]}]

Вдохновением для этого является взгляд на это видео, где Джон Мур предлагает, чтобы JSON не был хорошим форматом для гипермедиа api:

http://oredev.org/2010/sessions/hypermedia-apis

Действительно хороший разговор кстати!

Весь ввод оценен!

4b9b3361

Ответ 1

Я изучил эту тему некоторое время, но я не уверен, какие возможные решения используют ppl, а какие нет. Есть только несколько доступных примеров... Поэтому мне понадобится обзор экспертов... (Мои примеры будут в основном в HAL + JSON.)

1).

У меня такое чувство, что отношения связей должны быть только GET, потому что в HTML они предназначены для включения таких вещей, как таблицы стилей. Я думаю, что у другого ppl было такое же чувство, потому что отношения IATA связаны с edit-form и a create-form.

  • Итак, первое возможное решение для разыменования ссылок с отношениями формы и, следовательно, загрузка описаний форм для операций записи. Эти описания форм могут содержать фрагменты HTML или схему, которые мы можем использовать для создания форм. Например

    Просто упомянем, что вы можете использовать один и тот же подход, отправив те же ссылки в заголовке и отправив raw JSON как тело.

    {
        "_links": {
            "edit-form": {
                "href": "http://example.com/users/1?form=edit",
                "type": "text/html",
                "title": "Edit user"
            }
        }
    }
    

Итак, что, если отношения ссылок не только для чтения?

2.)

Затем мы можем использовать встроенные функции HAL:

  • Если мы отправляем данные, мы можем использовать type для описания тела запроса вместо тела ответа. Ofc. в этом случае не должно быть тела ответа, или это решение будет путать.

        {
            "_links": {
                "curies": [
                    {
                        "name": "my",
                        "href": "http://example.com/rels/{rel}",
                        "templated": true
                    }
                ],
                "my:edit": {
                    "href": "http://example.com/users/1",
                    "type": "application/vnd.example.user+json",
                    "title": "Edit user"
                }
            }
        }
    

    Итак, в этом случае клиент будет знать, что my:edit означает, что это форма редактирования, и, проверив тип MIME, он будет знать, какой тип формы будет отображаться.

  • Альтернативное решение для использования настраиваемого отношения ссылок для этой же цели:

        {
            "_links": {
                "curies": [
                    {
                        "name": "my",
                        "href": "http://example.com/rels/{rel}",
                        "templated": true
                    }
                ],
                "my:edit-user": {
                    "href": "http://example.com/users/1",
                    "type": "application/json",
                    "title": "Edit user"
                }
            }
        }
    

    Итак, извлекая docs http://example.com/rels/edit-user, мы можем найти описание о том, как создать форму для редактирования пользователей, и поэтому мы можем поддерживать связь ссылки my:edit-user в нашем клиенте. Документы могут содержать необязательную форму HTML или какую-либо схему или документ RDF с использованием словарного описания формы и т.д.

  • Мы можем следовать тому же подходу с помощью свойства profile ссылок. Например:

        {
            "_links": {
                "curies": [
                    {
                        "name": "my",
                        "href": "http://example.com/rels/{rel}",
                        "templated": true
                    }
                ],
                "my:edit": {
                    "href": "http://example.com/users/1",
                    "type": "application/json",
                    "title": "Edit user",
                    "profile": "http://example.com/profiles/user"
                }
            }
        }
    

    Итак, отношение ссылки означает, что это форма редактирования, а profile описывает, как сгенерировать форму под URL http://example.com/profiles/user.

3).

Или мы можем расширить HAL с помощью пользовательских свойств.

  • Например dougrain-forms делает следующее:

        {
            "_forms": {
                "edit": {
                    "href": "http://example.com/users/1",
                    "headers": {
                        "content-type": "application/json"
                    },
                    "title": "Edit user",
                    "method": "PUT",
                    "schema": {
                        "required": [
                            "name"
                        ],
                        "type": "object",
                        "properties": {
                            "name": {
                                "type": "string"
                            }
                        },
                        "title": "user properties"
                    }
                }
            }
        }
    
  • Но вы можете использовать любой альтернативный подход, если у нас нет стандарта о HAL и о формах HAL, например, я бы предпочел использовать схему mongoose как решение:

        {
            "name": "John",
            "_links": {
                "curies": [
                    {
                        "name": "my",
                        "href": "http://example.com/rels/{rel}",
                        "templated": true
                    }
                ],
                "my:edit": {
                    "href": "http://example.com/users/1",
                    "type": "application/json",
                    "title": "Edit user",
                    "method": "PUT",
                    "_embedded": {
                        "schema": {
                            "name": "String"
                        }
                    }
                }
            }
        }
    

4.)

Не используйте связи и простые JSON-форматы, такие как HAL, вместо этого используйте RDF с одним или несколькими словарями. Сложнее использовать RDF, но это прекрасное решение для развязки клиентов из служб REST, тогда как HAL - это просто крупнозернистое решение...

  • Например JSON-LD с Hydra и пользовательским vocab:

    {
        "@context": [
            "http://www.w3.org/ns/hydra/core",
            "https://example.com/docs#"
        ],
        "@id": "https://example.com/users/1",
        "name": "John",
        "operation": {
            "@type": "ReplaceResourceOperation",
            "title": "Edit user",
            "method": "PUT",
            "expects": {
                "@id": "https://example.com/docs#User",
                "supportedProperty": {
                    "@type": "SupportedProperty",
                    "title": "name",
                    "property": "https://example.com/docs#User.name",
                    "range": "http://www.w3.org/2001/XMLSchema#string",
                    "required": true
                }
            }
        }
    }
    

Ответ 2

Отъезд Collection + JSON, HAL и/или Siren.

Ответ 3

Стандарт JSON Schema (в частности, "гипер-схемы" ) определенно позволяет это. Вы ссылаетесь на схему JSON (Hyper-) (используя HTTP-заголовки), а схема определяет правила интерпретации ваших данных как гипертекста.

Информация для построения ваших ссылок может быть где угодно. Гипер-схема документирует, как собирать URI ссылок из данных (это может быть шаблон), а также указать метод HTTP, тип кодирования и т.д.

Чтобы получить функциональность формы: вы можете указать полную схему для данных, которые должны быть представлены вместе с запросом. Обязательные/необязательные свойства, ограничения длины массива, что угодно.

Как демонстрация, здесь часть прохода для библиотеки JavaScript, которая понимает гипер-схемы и может представить соответствующую форму для ссылок: jsonary.com.

Ответ 4

Я работаю над API, используя JSON Hyper Schema. Вы можете просматривать aroun, и даже зарегистрироваться, войти и сделать некоторые действия. Проверьте это здесь: http://api.psprt.com

[EDIT] Посмотрите мои последние новости здесь: www.passportedu.com https://github.com/bpanahij/HypermediaServer https://github.com/bpanahij/client-schema.json

Я также открываю код API: https://github.com/bpanahij/passportedu_schema

Не стесняйтесь смотреть, брать и комментировать.

JSON Hyper Schema (См. также JSON-Schema) имеет способ указать формы, через элемент свойств:

{
"id": "/api/v1",
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "PassportEDU API",
"name": "PassportEDU API",
"type": "object",
"description": "Bringing global students together with global schools.",
"links": [
   {
      "title": "Log In",
      "rel": "authenticate",
      "href": "/api/v1/authenticate",
      "method": "POST",
      "properties": {
        "username": {
          "title": "Your username",
          "description": "Your email address or username",
          "type": "string"
        },
        "password": {
          "title": "Your password",
          "description": "Your password",
          "type": "password"
        }
      },
      "required": ["username", "password"]
   }
   ]
}

Ответ 5

В настоящее время, насколько мне известно, в настоящее время нет формально открытого JSON-формата общего назначения с формами. Вы можете определить его, если вам это нужно, и опубликовать спецификацию. В качестве личного предпочтения я рекомендую использовать его для HAL.

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