Как передать несколько параметров в ASP.Net веб-API получить?
Я использую .Net MVC4 Web API для (надеюсь) реализации RESTful api. Мне нужно передать несколько параметров системе и заставить ее выполнить некоторые действия, а затем вернуть список объектов в качестве результатов. В частности, я передаю две даты и возвращаю записи, которые попадают между ними. Я также отслеживаю возвращенные записи, чтобы последующие вызовы не обрабатывались в системе.
Я рассмотрел несколько подходы:
сериализация параметров в одну строку JSON и ее разделение в API. http://forums.asp.net/t/1807316.aspx/1
передать параметры в строке запроса.
как лучше всего передать несколько параметров запроса в restful api?определение параметров маршрута: api / контроллер / date1 / date2
используя сообщение, которое по сути, позволяет мне передать объект с помощью params.
исследование 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) должны быть одинаковыми