it-swarm.com.ru

Как передать несколько параметров в GET ASP.Net Web API?

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

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

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

  2. Передайте параметры в строке запроса.
    Каков наилучший способ передачи нескольких параметров запроса в успокоительный API?

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

  4. Использование POST, которое по своей природе позволяет мне передавать объект с параметрами.

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

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

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

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

119
sig606

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

10
LukLed

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

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

Пример:

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

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

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

121
Mark Pieszak - DevHelp.Online

Просто добавьте новый маршрут к записям 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 
48
Graham Wright

Мне просто нужно было реализовать API RESTfull, где мне нужно передать параметры. Я сделал это, передав параметры в строке запроса в том же стиле, который описан в первом примере Марка «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');
                       }
        }
   });

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

44
Nigel Findlater

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

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

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

Это не дружественный и SEO дружественный

2. Передать параметры в строке запроса. Каков наилучший способ передать несколько параметров запроса в успокоительный API?

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

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

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

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

api/controller?start=date1&end=date2

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

api/controller/date1,date2
8
VJAI

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

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

2
ashwath hegde
    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");
            }
        }
    }
0
Jesse Mwangi

Я знаю, что это действительно старый, но я недавно хотел то же самое, и вот что я нашел ...

    public HttpResponseMessage Get([FromUri] string var, [FromUri] string test) {
        var retStr = new HttpResponseMessage(HttpStatusCode.OK);
        if (var.ToLower() == "getnew" && test.ToLower() == "test") {
            retStr.Content = new StringContent("Found Test", System.Text.Encoding.UTF8, "text/plain");
        } else {
            retStr.Content = new StringContent("Couldn't Find that test", System.Text.Encoding.UTF8, "text/plain");
        }

        return retStr;
    }

Так что теперь в ваш адрес/URI/...

hTTP (s): // myURL/API/myController/вар = getnew & тест = тест

Результат: «Найден тест»


hTTP (s): // myURL/API/myController/вар = getnew & тест = ничего

Результат: «Не удалось найти этот тест»

0
Rick Riggs