Вопрос по rest, asp.net-mvc, asp.net-web-api, asp.net-mvc-4, asp.net – Как передать несколько параметров в GET ASP.Net Web API?
Я использую .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, если это часто случается. И что может произойти, если параметры определены во время выполнения ...
В любом случае, для моей конкретной реализации, какой выбор (если есть) кажется лучшим?
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
), вы все еще можете использовать[FromUri]
? Я не могу заставить это работать.
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");
}
}
}
Что означает эта маркировка записи? Если это используется только для целей регистрации, я бы использовал GET и отключил бы все кэширование, так как вы хотите регистрировать каждый запрос для этих ресурсов. Если у маркировки записи есть другая цель, POST - путь. Пользователь должен знать, что его действия влияют на систему, а метод POST является предупреждением.
Я думаю, что самый простой способ - это просто использоватьAttributeRouting
.
В вашем контроллере очевидно, зачем вам это нужно в вашем глобальномWebApiConfig
файл?
Пример:
[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
public string Get(int paramOne, int paramTwo)
{
return "The [Route] with multiple params worked";
}
{}
имена должны соответствовать вашим параметрам.
Все просто, теперь у вас есть отдельныйGET
который обрабатывает несколько параметров в этом случае.
WebApiConfig
файл, но это действительно лучше.
Route
для именованных параметров (например, параметров запроса)?
Мне просто нужно было реализовать 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');
}
}
});
Надеюсь, это поможет...
С помощью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
Просто добавьте новый маршрут к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 стиля.