Abordé este problema de esta manera.
Utilicé un mensaje de publicación en la API para enviar la lista de enteros como datos.
Luego devolví los datos como un número inevitable.
El código de envío es el siguiente:
public override IEnumerable<Contact> Fill(IEnumerable<int> ids)
{
IEnumerable<Contact> result = null;
if (ids!=null&&ids.Count()>0)
{
try
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:49520/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
String _endPoint = "api/" + typeof(Contact).Name + "/ListArray";
HttpResponseMessage response = client.PostAsJsonAsync<IEnumerable<int>>(_endPoint, ids).Result;
response.EnsureSuccessStatusCode();
if (response.IsSuccessStatusCode)
{
result = JsonConvert.DeserializeObject<IEnumerable<Contact>>(response.Content.ReadAsStringAsync().Result);
}
}
}
catch (Exception)
{
}
}
return result;
}
El código de recepción es el siguiente:
// POST api/<controller>
[HttpPost]
[ActionName("ListArray")]
public IEnumerable<Contact> Post([FromBody]IEnumerable<int> ids)
{
IEnumerable<Contact> result = null;
if (ids != null && ids.Count() > 0)
{
return contactRepository.Fill(ids);
}
return result;
}
Funciona bien para un registro o muchos registros. El relleno es un método sobrecargado que usa DapperExtensions:
public override IEnumerable<Contact> Fill(IEnumerable<int> ids)
{
IEnumerable<Contact> result = null;
if (ids != null && ids.Count() > 0)
{
using (IDbConnection dbConnection = ConnectionProvider.OpenConnection())
{
dbConnection.Open();
var predicate = Predicates.Field<Contact>(f => f.id, Operator.Eq, ids);
result = dbConnection.GetList<Contact>(predicate);
dbConnection.Close();
}
}
return result;
}
Esto le permite obtener datos de una tabla compuesta (la lista de id) y luego devolver los registros que realmente le interesan de la tabla de destino.
Puede hacer lo mismo con una vista, pero esto le da un poco más de control y flexibilidad.
Además, los detalles de lo que está buscando en la base de datos no se muestran en la cadena de consulta. Tampoco tiene que convertir desde un archivo csv.
Debe tener en cuenta al usar cualquier herramienta como la interfaz web api 2.x, es que las funciones get, put, post, delete, head, etc. tienen un uso general, pero no están restringidas a ese uso.
Por lo tanto, aunque la publicación se usa generalmente en un contexto de creación en la interfaz de la API web, no se limita a ese uso. Es una llamada html normal que se puede usar para cualquier propósito permitido por la práctica html.
Además, los detalles de lo que está sucediendo están ocultos para esos "ojos curiosos" de los que tanto escuchamos en estos días.
La flexibilidad en las convenciones de nomenclatura en la interfaz de la API web 2.x y el uso de llamadas web regulares significa que envía una llamada a la API web que engaña a los intrusos para que piensen que realmente está haciendo otra cosa. Puede usar "POST" para realmente recuperar datos, por ejemplo.