¿Cómo debo pasar múltiples parámetros a un ASP.Net Web API GET?



Answers

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.

Question

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:

  1. Serializando los params en una sola cadena JSON y seleccionándola en la API. http://forums.asp.net/t/1807316.aspx/1

  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?

  3. Definir los parámetros en la ruta: api / controller / date1 / date2

  4. Usar un POST que inherentemente me permite pasar un objeto con params.

  5. 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



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...






Related