Является ли реализация CRUD-слоя на основе HTTP, XML хорошей идеей? - PullRequest
1 голос
/ 10 августа 2009

Я делаю CRUD-слой для приложения. Это будет простое приложение CRUD, которое, например, хранит информацию о пользователе, избранные ссылки и т. Д. И не выполняет операций с данными типа факта. На самом деле это только для хранения таких вещей, как «Пользователи», «Права», «Правила», «Политики» и т. Д., Которые другие части приложения выбирают для выполнения работы.

В целом, я хочу три вещи из этого усилия:

  • (a) Одна точка входа для доступа к функциям CRUD
  • (b) Возможность использовать любой «клиент» для использования слоя CRUD
  • (c) «легкая» расширяемость CRUD, при которой новый объект может быть добавлен, а старые объекты могут быть изменены (новые поля добавлены, больше ничего не удалено или не изменено). Типичный сценарий CRUD?

Я думаю, что мне следует создать библиотеку Java, предоставить ее клиентам через "REST-type-URL" ( означает просто REST-URL-way, например, "users / delete / 2" ) API через HTTP. Таким образом, я могу достичь всех 3 целей - слой CRUD может быть в Linux, клиент может быть в Windows.

В слое CRUD я буду использовать для этого разные вещи: ORM, веб-сервер и другие инструменты.

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

Что я думаю о том, чтобы сделать какой-то слишком упрощенный взгляд на встраивание набора методов API в фрагмент XML? ( обратите внимание, что я не делаю XML-RPC, скорее эти фрагменты XML будут только данными - и XML будет отправлен на определенные URL-адреса, такие как users / update / 2, которые будут обрабатывать XML после подтверждения того, что XML содержит информацию для профиля пользователя )

Прав ли я в своих мыслях? Есть ли у этой идеи хоть какой-то отдаленный шанс на работу?

Любая помощь приветствуется!

Ответы [ 4 ]

2 голосов
/ 10 августа 2009

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

Предоставление слоя данных, как вы предлагаете, тесно связывает ваши клиентские приложения с моделью данных, а использование http делает выполнение транзакций с несколькими запросами очень трудным. Я знаю, что вы сказали, что вам не нужно делать транзакции с несколькими запросами. Не сегодня, а может в следующем году?

Какова продолжительность жизни этого приложения? Если вы скажете больше, чем пару лет, я бы переосмыслил идею предоставления слоя данных удаленным клиентам. Одна из основных целей REST - разъединить клиентское и серверное приложения, чтобы позволить приложениям развиваться в течение длительного периода времени. Если у вас есть несколько клиентских приложений, обращающихся к распределенной службе, если она не разработана правильно, она может быстро столкнуться с неприятными проблемами обслуживания и управления версиями.

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

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

  1. Вы можете разрешить клиенту явно знать содержимое данных, содержащихся в представлении. То есть Клиент знает, что в некоторых элементах XML есть имя пользователя и пароль. Однако, если вы сделаете это, вы должны вернуть определенный тип носителя, например, Приложение / vnd.mycompany.user + XML. Вы не должны использовать application / xml, так как это ничего не говорит клиенту о том, что находится в XML-документе. Если клиент должен был знать, что «когда вы переходите на URL X», вы получаете «документ XML, содержащий элементы UserName и Password внутри элемента User», то вы нарушили самоописательное ограничение REST. В результате вы подключили конечную точку к типу носителя и фактически подключили клиента к этой конечной точке. Цель "гипермедиа ограничения" REST состоит в том, чтобы предотвратить связь между клиентом и конечными точками.
  2. Альтернативой является использование более общего типа мультимедиа, который просто предназначен для предоставления клиенту контента для отображения пользователю и предоставления пользователю опций, позволяющих клиенту предпринимать действия. Html media type позволяет вам сделать это, предоставив язык разметки, который можно использовать для возврата имени пользователя и пароля в двух тегах div. Используя тег html FORM и тег A, клиент может выполнять дополнительные операции с этим ресурсом. Выяснить, как сделать доступными все возможные операции, которые может иметь «пользовательский» объект, действительно RESTful-способом, сложно и требует совсем немного опыта, но конечный результат - это очень хорошо отделенные клиент и сервер. Посмотрите на веб-браузер в качестве примера, как часто вам нужно обновлять браузер, потому что веб-сайт изменил свое содержимое.

Проблема со вторым вариантом заключается в том, что при использовании только HTML взаимодействие с конечным пользователем имеет тенденцию быть довольно ограниченным, и именно здесь вступает Javascript. Одним из «необязательных» ограничений REST является использование загрузки кода. Javascript - это код, который загружается с сервера для обеспечения дополнительного поведения на клиенте. К сожалению, на мой взгляд, он также предоставляет людям возможность создавать веб-интерфейсы RESTful, которые возвращают application / xml, а затем используют javascript для интерпретации этого общего формата. Это решение отлично работает для первоначального разработчика веб-сайта, который использует RESTful API, потому что если изменяется содержимое XML-файла, тогда javascript может быть изменен и повторно загружен в браузер, и все хорошо. Однако для любого другого стороннего разработчика, который обращается к этому API, который не контролирует модель содержимого application / xml, их код становится полностью хрупким и потенциально может сломаться при изменении содержимого API. Спросите любого, кто написал какой-либо клиент для Твиттера, сколько раз их приложение ломалось из-за того, что Твиттер изменял содержание.

Используя первую опцию и назначая контенту определенный тип мультимедиа, разработчик сервера может представить новый тип мультимедиа под названием application / vnd.mycompany.userV2 + xml, и с помощью согласования контента существующие клиенты могут по-прежнему получать исходный мультимедиа тип и новые клиенты могут быть созданы для использования нового типа носителя. URL остается прежним, закладки не нарушаются, поскольку конечная точка и медиатип не связаны.

Если вы видите документацию API, в которой содержится список URL-адресов и содержимое, возвращаемое из этих URL-адресов, скорее всего, эти разработчики просто не получат REST и не получат преимуществ, которые предоставляет интерфейс RESTful. По иронии судьбы, пострадают не те разработчики, а сторонние разработчики, пытающиеся взаимодействовать с API!

1 голос
/ 10 августа 2009

Для чистого уровня данных задумывались ли вы о поддержке транзакций?

  • Вам нужно поддерживать транзакции? Если так, как они будут реализованы?
  • Будут ли транзакции охватывать несколько HTTP-запросов? (Я бы подумал, что для чистой реализации REST у вас будет несколько вызовов для нетривиальных операций.) Например, дебет одного счета и кредит другого счета.
  • Кто будет контролировать транзакции?

Если контроль транзакций не требуется сейчас, можете ли вы увидеть его в будущем? Как это повлияет на ваш дизайн?

Больше вопросов, чем ответов. :) Но пища для размышлений.

UPDATE:

Я бы создал стандартный слой доступа к данным, используя предпочитаемый вами язык (в вашем случае Java) и любые другие необходимые вам библиотеки (например, ORM). Если у вас уже есть дизайн слоя доступа к данным, я бы следовал этому, чтобы сделать приложение простым. Если вы хотите раскрыть это извне (различным клиентам), я бы сделал это на том уровне, который я бы назвал сервисным / бизнес-уровнем (если бы функциональность была простой, без возможности повторного использования, сворачивая оба варианта в одну реализацию, вероятно, все было бы в порядке). Там вы будете обрабатывать любые меры безопасности (аутентификация, авторизация и т. Д.), Проверку данных и потенциально выполнять любое сопоставление между вашим внутренним представлением данных и внешним представлением. Затем вы можете предоставить свои услуги в соответствии с вашим API на основе URL. Это дает вам некоторое разделение между фактической реализацией доступа к данным и вашим интерфейсом.

Возможно, мы говорим об одном и том же, но наша семантика просто отличается.

1 голос
/ 10 августа 2009

Это хорошая идея, если вы хотите получить доступ к функции CRUD от нескольких клиентов. Мы занимаемся чем-то вроде этого некоторое время. Некоторые детали реализации, которые могут вам помочь.

  1. Просто HTTP-вызов достаточно хорош, не беспокойтесь о REST. Чтобы быть RESTful, вы должны следовать следующим правилам (GET для READ, PUT для создания и т. Д.). Просто используйте GET, чтобы его можно было легко проверить в браузере. Мы используем XSLT для форматирования ответа в таблицы в HTML.

  2. Мы используем одну XML-схему для обработки всех ответов. По сути, это XML-представление результатов SQL, которое должно быть достаточно гибким для обработки нескольких наборов результатов, затронутых строк, ответа на ошибку, кода возврата и т. Д.

  3. Имеет представление XML в формате JSON, чтобы его было легче обрабатывать в Javascript.

  4. Мы также добавили бэкдор SQL, чтобы произвольная инструкция SQL могла быть отправлена ​​в базу данных. Это очень удобно для отладки. Для такого вызова требуется некоторая безопасность. Мы выставляем его только в офисную сеть.

0 голосов
/ 10 августа 2009

Если вы ищете решение Java, я предлагаю вам взглянуть на Restlets . Вы в значительной степени смешиваете архитектуру в стиле XML-RPC и REST. Здесь - различия между RPC и REST.
Вы должны использовать URI для определения действия и параметров вместо передачи XML, если вы хотите сделать это RESTful способом.

...