2013-08-13 3 views
3

Я создаю RESTful API с помощью Microsoft ASP.NET WebAPI. Моя проблема связана с методом GET или более точным, оптимальным решением для построения строк запроса/фильтрации в URL-адресах.Строка фильтра/строка запроса для RESTful API

В моем приложении API RESTful действует как прокси-сервер или точка доступа к моим ресурсам, хранящимся в базе данных. Он предназначен для извлечения, вставки, изменения или удаления записей. Вся система хранит только один тип сущности, который довольно сложный, поскольку он содержит множество различных полей, списков и данных в целом. Я использую NoSQL для хранения этих объектов, так как их довольно много.

Проблема заключается в создании правильной строки запроса для извлечения этих объектов по указанным критериям. Классическая строка запроса выглядит следующим образом:

http://localhost/api/entities?field1=val1&field2=val2&field10=val3 

Что случилось с этим видом строки запроса является то, что оно только позволяет указать поле значения от оператора равенства, и там нет места для логических операторов между каждым полем (& лечатся как некоторый оператор И).

Что мне нужно, чтобы указать более сложные строки запроса, больше как фильтры. Я хочу, чтобы сказать системе, что я хочу, чтобы получить записи, которые имеют, например:

FIELD1> = значению1 ИЛИ FIELD2 = значение2 И field3 ~ value3

~ это указывает на то, что я хочу для сопоставления поля3 с value3 с использованием алгоритма FUZZY (хотя я не уверен, что ~ правильный символ, указывающий на намерение использовать нечеткий поиск).

Ну, как вы можете видеть, классическая строка запроса не способна поддерживать это. На данный момент я прохожу такую ​​строку запроса:

http://localhost/api/entities?query=field1>=value1$OR$field2=value2$AND$field3~value3 

я прохожу такой фильтр, как одну строку к методу моего контроллера и вручную разобрать его. Мой разделитель равен $, так как ASP.NET WebAPI будет автоматически разделять эти параметры, если между ними есть символ «&», и я не хочу, чтобы он это делал, потому что он не может отображать логические операторы (OR, AND, и т. д.) к параметрам метода в этом случае. Я не уверен, если я делаю правильные вещи, анализируя эту строку вручную (все после того, как символ «?»):

field1>=value1$OR$field2=value2$AND$field3~value3 

Мой вопрос являются:

  1. Что такое правильный способ представляя такие запросы в URL-адресах API RESTful?
  2. Есть ли существующее решение для поддержки таких фильтров в ASP.NET WebAPI, кроме написания моего собственного алгоритма синтаксического анализа?

ответ

0

Я бы порекомендовал вам проверить OData. Он встроен в web api (http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api). Это может быть сложной задачей, если вы строите объекты домена из данных и пытаетесь работать с ними, но если ваши объекты прямо из базы данных, это может быть очень мощным. Я не уверен в вашем нечетком совпадении, но некоторые примеры фильтрации, на которые он способен, можно увидеть на http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options.

+0

Ну, мои объекты данных имеют ту же схему свойств, что и в базе данных, но я использую NoSQL (ElasticSearch).Я не уверен, что OData - это решение, зависящее от базы данных, и если оно поддерживает NoSQL. –

Смежные вопросы