Вопрос по rest, asp.net-mvc, asp.net-web-api, asp.net-mvc-4, asp.net – Как передать несколько параметров в GET ASP.Net Web API?

121

Я использую .Net MVC4 Web API для (надеюсь) реализации API RESTful. Мне нужно передать несколько параметров в систему и заставить ее выполнить какое-то действие, а затем вернуть список объектов в качестве результатов. В частности, я передаю две даты и возвращаю записи, которые попадают между ними. Я также отслеживаю возвращенные записи, чтобы последующие вызовы не обрабатывались повторно в системе.

Я рассмотрел несколько подходов:

Serializing the params into one single JSON string and picking it apart in the API. http://forums.asp.net/t/1807316.aspx/1

Pass the params in the query string.
What is best way to pass multiple query parameters to a restful api?

Defining the params in the route: api/controller/date1/date2

Using a POST that inherently lets me pass an object with params.

Researching ODATA since the Web API (currently) supports it. I haven't done much with this yet so I'm not very familiar with it.

Кажется, что правильные методы REST указывают, когда данные извлекаются, вы должны использовать GET. Тем не менее, GET также должен быть нулевым (не вызывает побочных эффектов), и мне интересно, нарушает ли это моя конкретная реализация, поскольку я отмечаю записи в системе API, следовательно, я создаю побочные эффекты.

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

В любом случае, для моей конкретной реализации, какой выбор (если есть) кажется лучшим?

Ваш Ответ

9   ответов
37

http://habrahabr.ru/post/164945/

public class ResourceQuery
{
   public string Param1 { get; set; }
   public int OptionalParam2 { get; set; }
}

public class SampleResourceController : ApiController
{
    public SampleResourceModel Get([FromUri] ResourceQuery query)
    {
        // action
    }
}
Это то, чем я занимаюсь уже довольно давно, и это отлично работает! Я также рекомендую это решение.
Ключом здесь является [FromUri]
Хотя статья на русском языке, @tranceporter прав. & Quot; FromUri & quot; выглядит как отличный способ получить параметры из URL. Еще одна статья, которая может быть полезна:asp.net/web-api/overview/formats-and-model-binding/…
Если вы вызываете в другой вспомогательный метод (неGet), вы все еще можете использовать[FromUri]? Я не могу заставить это работать.
0
    public HttpResponseMessage Get(int id,string numb)
    {
        //this will differ according to your entity name
        using (MarketEntities entities = new MarketEntities())
        {
          var ent=  entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb);
            if (ent != null)
            {
                return Request.CreateResponse(HttpStatusCode.OK, ent);
            }
            else
            {
                return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system");
            }
        }
    }
2
 [Route("api/controller/{one}/{two}")]
    public string Get(int One, int Two)
    {
        return "both params of the root link({one},{two}) and Get function parameters (one, two)  should be same ";
    }

Оба параметра корневой ссылки ({one}, {two}) и параметров функции Get (one, two) должны быть одинаковыми

10

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

Под пометкой я имею в виду просто отслеживание того, какие записи обрабатываются и возвращаются, чтобы последующие вызовы не повторяли их. В моем случае я просто делаю вставку в другую таблицу для отслеживания обработки. sig606
@ sig606: POST - это путь для меня, но ваш протокол не выглядит безопасным. Что если что-то случится и записи будут получены на стороне клиента, но не обработаны из-за ошибки? Вы больше не вернете их, и у клиента останутся потерянные данные.
Прямо сейчас у меня это реализовано как ПОЧТА в основном по той причине, о которой вы сказали - действия происходят, и потребитель знает о них. Кроме того, это кажется простым и наиболее гибким в отношении передачи различных данных. sig606
Прямо сейчас мой API возвращает записи только после того, как они были обработаны. Таким образом, потребитель передает API две даты. Записи между этими двумя датами обрабатываются и помечаются. Затем данные возвращаются вызывающей стороне. Я полагаю, что если что-то случится во время обработки или после обработки до достижения клиента, у меня есть проблема. sig606
123

Я думаю, что самый простой способ - это просто использоватьAttributeRouting.

В вашем контроллере очевидно, зачем вам это нужно в вашем глобальномWebApiConfig файл?

Пример:

    [Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
    public string Get(int paramOne, int paramTwo)
    {
        return "The [Route] with multiple params worked";
    }

{} имена должны соответствовать вашим параметрам.

Все просто, теперь у вас есть отдельныйGET который обрабатывает несколько параметров в этом случае.

Это замечательно. Большинство людей рекомендуют настроить маршрут вWebApiConfig файл, но это действительно лучше.
Если требуется имя метода действия, его можно изменить, чтобы приспособить его. [Route (& quot; api / YOURCONTROLLER / Get / {paramOne} / {paramTwo} & quot;)] открытая строка Get (int paramOne, int paramTwo) {return & quot; что-то & quot ;; }
Действительно, мы (большинство людей) рекомендуем иметь централизованную область управления для вашей конфигурации. В случае веб-API (Microsoft или иным способом) централизованные шаблоны для REST являются ключевыми. Маршрутизация атрибутов симпатична, но делает одноразовые исключения слишком заманчивыми.
Есть ли способ установитьRoute для именованных параметров (например, параметров запроса)?
Согласен, мне нужно обновить свой ответ на самом деле. Есть гораздо лучший способ сделать несколько параметров с помощью GET. Написал это, когда я был новичком в WebAPI, теперь я не использую AttributeRouting (если я просто не хочу создавать новый контроллер), и не передаю все параметры в QueryString, они отображаются автоматически. Обновление, когда я получаю шанс, чтобы люди не использовали этот старый метод
44

Мне просто нужно было реализовать API RESTfull, где мне нужно передать параметры. Я сделал это, передав параметры в строке запроса в том же стиле, который описан в первом примере Марка: api / controller? Start = date1 & end = date2 & quot;

В контроллере я использовал совет отURL разделен в C #?

// uri: /api/courses
public IEnumerable<Course> Get()
{
    NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
    var system = nvc["System"];
    // BL comes here
    return _courses;
}

В моем случае я звонил в WebApi через Ajax и выглядел следующим образом:

$.ajax({
        url: '/api/DbMetaData',
        type: 'GET',
        data: { system : 'My System',
                searchString: '123' },
        dataType: 'json',
        success: function (data) {
                  $.each(data, function (index, v) {
                  alert(index + ': ' + v.name);
                  });
         },
         statusCode: {
                  404: function () {
                       alert('Failed');
                       }
        }
   });

Надеюсь, это поможет...

Я полагаю, вы не используете WebApi, потому что ParameterBinding автоматически сопоставит вашу строку запроса с параметрами вашего метода API ...
Да, лучшим способом было бы использовать такие атрибуты, как [Route (& quot; api / DbMetaData / {system} / {searchString} & quot;)], а затем добавить эти параметры в Get (строка system, string searchString) и затем вызвать с & quot; ... api / DbMetaData / mysystem / mysearchstring & quot;
Я использовал его пример в своем C # MVC WebApi, и он работал нормально. +1 например
8

С помощьюGET или жеPOST четко объясняется@LukLed, Что касается способов передачи параметров, я бы предложил использовать второй подход (я не очень разбираюсь вODATA или).

1.Serializing the params into one single JSON string and picking it apart in the API. http://forums.asp.net/t/1807316.aspx/1

Это неuser friendly а такжеSEO friendly

2.Pass the params in the query string. What is best way to pass multiple query parameters to a restful api?

Это обычный предпочтительный подход.

3.Defining the params in the route: api/controller/date1/date2

Это определенно не очень хороший подход. Это заставляет чувствовать кого-тоdate2 это подресурсdate1 и это не так. Обаdate1 а такжеdate2 являются параметрами запроса и находятся на одном уровне.

В простом случае я хотел бы предложить такой URI,

api/controller?start=date1&end=date2

Но мне лично нравится приведенный ниже шаблон URI, но в этом случае нам нужно написать собственный код для сопоставления параметров.

api/controller/date1,date2
Я надеюсь, что у вас уже есть ответы, то почему вы задаете вопрос?
На самом деле, это были мои объяснения. Я думаю, что LukLed осветил мои теги и ссылку URL. sig606
Извините за этот поздний ответ, Марк. Я попробовал несколько решений, но не был уверен, что это было лучше, и пытался придерживаться стандартных отраслевых подходов, поэтому я разместил здесь на SO. sig606
@ Марк Что-то вроде следующего:stackoverflow.com/questions/9681658/…?
Что касается SEO, то в этом случае оно не будет применяться. Этот код будет «сервер-сервер», поэтому мне было бы все равно, обнаружит ли его когда-либо внешний мир. На самом деле, я должен убедиться, что предприняты надлежащие меры безопасности, чтобы избежать произвольного доступа. Мне пришлось выполнить сериализацию JSON для другой части системы (похоже, это ошибка при попытке размещения больших списков объектов в формате POST, поэтому мне пришлось сериализовать в строку), так что в этом случае это не будет большой натяжкой. , sig606
48

Просто добавьте новый маршрут кWebApiConfig записей.

Например, позвонить:

public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..

добавлять:

config.Routes.MapHttpRoute(
    name: "GetPagedData",
    routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);

Затем добавьте параметры в вызов HTTP:

GET //<service address>/Api/Data/2/10 
Это, кажется, единственный ответ, который перечисляет все части. Я хотел бы, чтобы кто-то лучше описал, как использоватьapi/controller?start=date1&end=date2 URI стиля.
Качественный товар. Спасибо!
@ Горячий ответ Ответ Эндрю Вериги хорошо работает с аргументами строки запроса. По сути, вы связываете имена строк запроса со свойствами класса и передаете их в свой метод. Ваш метод будет принимать единственный аргумент класса, помеченный атрибутом [FromUri], и будет иметь аргументы строки запроса в качестве своих свойств.

Похожие вопросы