asp.net - query - web api from uri
¿Cómo debo pasar múltiples parámetros a un ASP.Net Web API GET? (7)
¿Qué significa esta marca de registro? Si esto se usa solo para fines de registro, usaría GET y desactivaría todo el almacenamiento en caché, ya que desea registrar cada consulta para estos recursos. Si esta marca de registro tiene otro propósito, POST es el camino a seguir. El usuario debe saber que sus acciones afectan al sistema y que el método POST es una advertencia.
Estoy usando .Net MVC4 Web API para (con suerte) implementar una API REST. Necesito pasar algunos parámetros al sistema y hacer que realice alguna acción, luego devolver una lista de objetos como resultados. Específicamente, estoy aprobando dos fechas y devolviendo los registros que se encuentran entre ellos. También estoy realizando un seguimiento de los registros devueltos para que las llamadas subsiguientes no se reprocesen en el sistema.
He considerado algunos enfoques:
Serializando los params en una sola cadena JSON y seleccionándola en la API. http://forums.asp.net/t/1807316.aspx/1
Pase los parámetros en la cadena de consulta.
¿Cuál es la mejor manera de pasar múltiples parámetros de consulta a una api relajante?Definir los parámetros en la ruta: api / controller / date1 / date2
Usar un POST que inherentemente me permite pasar un objeto con params.
Investigando ODATA ya que la API web (actualmente) lo admite. Todavía no he hecho mucho con esto, así que no estoy muy familiarizado con esto.
Parece que las prácticas adecuadas de REST indican que cuando se extraen los datos, debe usar un GET. Sin embargo, GET también debe ser nula (no produce efectos secundarios), y me pregunto si mi implementación específica viola eso ya que marcó registros en el sistema API, por lo tanto, estoy produciendo efectos secundarios.
También me llevó a la cuestión de apoyar parámetros variables. Si la lista de parámetros de entrada cambia, sería tedioso tener que volver a definir su ruta para la Opción 3 si eso sucede mucho. Y qué podría pasar si los parámetros se definen en tiempo de ejecución ...
En cualquier caso, para mi implementación específica, ¿qué opción (si hay alguna) parece mejor?
El uso de GET o POST se explica claramente por @LukLed . En cuanto a las formas en que puede pasar los parámetros, le sugiero que vaya con el segundo enfoque (tampoco sé mucho sobre ODATA ).
1.Serializando los params en una sola cadena JSON y seleccionándola en la API. http://forums.asp.net/t/1807316.aspx/1
Esto no es fácil de usar y es amigable con SEO
2. Pase los parámetros en la cadena de consulta. ¿Cuál es la mejor manera de pasar múltiples parámetros de consulta a una api relajante?
Este es el enfoque usual preferido.
3. Definir los parámetros en la ruta: api / controller / date1 / date2
Este definitivamente no es un buen enfoque. Esto hace sentir que una date2
es un recurso secundario de date1
y ese no es el caso. Tanto la date1
como la date2
son parámetros de consulta y vienen en el mismo nivel.
En caso simple, sugeriría un URI como este,
api/controller?start=date1&end=date2
Pero personalmente me gusta el siguiente patrón de URI, pero en este caso tenemos que escribir un código personalizado para mapear los parámetros.
api/controller/date1,date2
Encontré una solución excelente en 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
}
}
Simplemente agregue una nueva ruta a las entradas de WebApiConfig
.
Por ejemplo, para llamar:
public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..
añadir:
config.Routes.MapHttpRoute(
name: "GetPagedData",
routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);
A continuación, agregue los parámetros a la llamada HTTP:
GET //<service address>/Api/Data/2/10
Solo tuve que implementar una API REST llena cuando necesito pasar parámetros. Hice esto pasando los parámetros en la cadena de consulta en el mismo estilo que el descrito por el primer ejemplo de Mark "api / controller? Start = date1 & end = date2"
En el controlador, utilicé una sugerencia de URL dividida en C #?
// uri: /api/courses
public IEnumerable<Course> Get()
{
NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
var system = nvc["System"];
// BL comes here
return _courses;
}
En mi caso, estaba llamando a WebApi a través de Ajax con el siguiente aspecto:
$.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'');
}
}
});
Espero que esto ayude...
Use la vinculación de parámetros como se describe completamente aquí: asp.net/web-api/overview/formats-and-model-binding/…
Creo que la manera más fácil es simplemente usar AttributeRouting
.
Es obvio dentro de su controlador, ¿por qué querría esto en su archivo Global WebApiConfig
?
Ejemplo:
[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
public string Get(int paramOne, int paramTwo)
{
return "The [Route] with multiple params worked";
}
Los {}
nombres necesitan coincidir con tus parámetros.
Tan simple como eso, ahora tiene un GET
separado que maneja params múltiples en esta instancia.