Как передать несколько параметров в ASP.Net веб-API получить?

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

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

  1. сериализация параметров в одну строку JSON и ее разделение в API. http://forums.asp.net/t/1807316.aspx/1

  2. передать параметры в строке запроса.
    как лучше всего передать несколько параметров запроса в restful api?

  3. определение параметров маршрута: api / контроллер / date1 / date2

  4. используя сообщение, которое по сути, позволяет мне передать объект с помощью params.

  5. исследование ODATA, так как веб-API (в настоящее время) поддерживает его. Я еще не много с этим сделал, поэтому я не очень хорошо знаком с ним.

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

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

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

8 ответов


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


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

очевидно, что в вашем контроллере, почему вы хотите, чтобы это было в вашем глобальном ?

пример:

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

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

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


просто добавьте новый маршрут в 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 

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

в контроллере я использовал наконечник от 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');
                       }
        }
   });

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


Я нашел отличное решение на 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
    }
}

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

1.Сериализация параметров в одну строку JSON и ее разделение в API. http://forums.asp.net/t/1807316.aspx/1

это не пользователь дружелюбный и SEO дружественных

2.Передавать параметры в строке запроса. Как лучше всего передать несколько параметров запроса в restful api?

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

3.Определение параметров в маршруте: api / controller/date1 / date2

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

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

api/controller?start=date1&end=date2

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

api/controller/date1,date2

используйте привязку параметров, как описано полностью здесь : http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api


 [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) должны быть одинаковыми