Как я могу использовать MIME-ТИПЫ конкретного поставщика для "REST API" с частной маркировкой - PullRequest
6 голосов
/ 03 августа 2011

Я разрабатываю RESTful API.В настоящее время я рассматриваю возможность использования MIME-типов поставщиков для передачи семантики и значения, а также в качестве «контракта» между клиентом и сервером.

Так, например, application / vnd.mycompany.person + xml будет означать, что данные, о которых идет речь, представляют собой xml, представляющий человека.

У меня есть требование сделать этот API «частным», то есть посредник, в свою очередь, может предоставить API своему клиенту безего клиент, зная, что это услуга моей компании.Это будет работать так, что моя компания будет размещать основные API-интерфейсы по типу общего URL-адреса, т.е. www.example.com/api, тогда моя компания будет использовать CNAME для указания нашего доменного имени на этот URL-адрес, и наши посредники смогут это сделать.то же самое.

Внутренне все ссылки на ресурсы будут относительными от корня API, и поэтому будут учитываться фактические URL-адреса, которые используются.

ОДНАКО, я не хочу понимать/ поддерживает произвольные MIME-типы, определяемые поставщиком, так какой должна быть часть «mycompany» в приведенном выше примере MIME-типа?

Ответы [ 2 ]

4 голосов
/ 03 августа 2011

Спецификация HTTP говорит :

Использование незарегистрированных типов мультимедиа не рекомендуется.

Раньше я использовал «нестандартные» типы мультимедиа на моей платформе, но это вызывало проблемы с пользовательскими агентами (браузерами, cURL, wget и т. Д.), Не распознающими контент.

Вы можете попытаться зарегистрировать свой пользовательский тип носителя, но (A) это займет некоторое время; (B) пройдет очень много времени, прежде чем пользовательские агенты узнают тип, если вообще когда-либо; (C) вы указали, что не хотите, чтобы название компании всегда присутствовало.

В качестве альтернативы «настраиваемым» типам мультимедиа я рекомендую вместо этого использовать параметры типа мультимедиа; это благословенный способ добавления дополнительной информации о контенте в типы мультимедиа.

Используя параметры, ваш тип носителя может быть application/xml; mycompany-schema=person или, может быть, просто application/xml; schema=person.

2 голосов
/ 17 сентября 2013

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

Одна из проблем этого подхода заключается в том, что по своей природе это хак или мошенничество, чтобы «заставить его работать» так, как вы хотите, когда весь смысл перехода на REST-сервис, управляемый гипермедиа, заключается в изменении моделиваш API и сервис и измените подход к проблеме.Пролить «действительное» или разрешенное, но не рекомендуемое значение HTTP для Content-Type - все равно что сказать голодающим венесуэльцам, что крысы - рыба, чтобы они могли есть их без греха во время Великого поста.Что-то не так с едой крысы, если это все, что у тебя есть?Возможно нет.Но притворяется, что это рыба, делает ее рыбой?Конечно, нет.Если вам нужен интерфейс, управляемый контрактом, используйте RPC или SOAP или даже пользовательский тип MIME.Но не указывайте на спецификацию и говорите, что это Отдых, потому что в конце концов вы едите крысу, и все это знают, а вы лжете только себе.

Вторая проблема заключается в том, что вы теряете действительноеНаграды за интерфейс, управляемый гипермедиа, когда вы сокращаете углы.Сразу же вы столкнулись с проблемами с пользовательскими агентами и вашим собственным сервером, вынужденным перепрыгивать через обручи или просто сдаваться, потому что mime-тип был незнаком.И все потому, что вы думали, что могли бы иметь и то и другое, когда смысл не в том, чтобы произвести впечатление на ваших клиентов претензиями на настоящую услугу Отдыха или немного облегчить нагрузку, сбросив (очевидно, ценный для некоторых контекстов) дополнительный вес контракта.управляемое взаимодействие, оно должно было изменить то, как ваш сервис на самом деле взаимодействовал с внешними клиентами.

Наконец, мне действительно непонятно, как конкретный тип MIME вендора обеспечивает выполнение контракта лучше, чем определенная конечная точка?Все сайты, которые упоминают эту технику, кажутся просто светящимися от облегчения, что эта опция существует, и, откровенно говоря, немного самодовольны и довольны тем, что используют ее, как будто они знают, что это технически "непослушно", но это так просто и исправляетвсе.Что это исправит?В вашем случае, почему бы вам просто не получить входящий person запрос / контент по адресу:

POST /myRestService/people

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

GET /myRestService/people/personID_123/does_something 

или

GET /myRestService/people/does_something/personID_123

в зависимости от точного контекста?

И простотак что я не звучу злобно на вершине психов, любое разочарование или гнев вовсе не направлены на вас или ваш вопрос, но на «решение» продавца типа «пантомима» и навязчивой идеи у каждого разработан для «Roy Fielding, официально одобренного и помеченного как действительный REST-сервис», который, очевидно, никто даже не может предоставить работающему публичному примеру, оставляя только ощущение безотлагательности, чтобы принять его немедленно, используя любые необходимые ярлыки, и мы можемс позором и пальцем, указывающим позже, когда мы на самом деле исправляем проблемы, возникшие из-за ярлыков.

...