Ho affrontato questo problema in questo modo.
Ho usato un messaggio postale per l'API per inviare l'elenco di numeri interi come dati.
Quindi ho restituito i dati come un ienumerable.
Il codice di invio è il seguente:
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;
}
Il codice di ricezione è il seguente:
// 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;
}
Funziona bene per un record o molti record. Il riempimento è un metodo sovraccarico che utilizza 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;
}
Ciò consente di recuperare i dati da una tabella composita (l'elenco ID) e quindi restituire i record a cui si è realmente interessati dalla tabella di destinazione.
Potresti fare lo stesso con una vista, ma questo ti dà un po 'più di controllo e flessibilità.
Inoltre, i dettagli di ciò che si sta cercando dal database non vengono visualizzati nella stringa di query. Inoltre, non è necessario convertire da un file CSV.
Devi tenere presente che quando usi qualsiasi strumento come l'interfaccia web api 2.x è che le funzioni get, put, post, delete, head, ecc. Hanno un uso generale, ma non sono limitate a tale uso.
Quindi, sebbene la posta sia generalmente usata in un contesto di creazione nell'interfaccia API di web, non è limitata a quell'uso. Si tratta di una normale chiamata HTML che può essere utilizzata per qualsiasi scopo consentito dalla pratica HTML.
Inoltre, i dettagli di ciò che sta accadendo sono nascosti da quegli "occhi indiscreti" di cui sentiamo così tanto parlare in questi giorni.
La flessibilità nelle convenzioni di denominazione nell'interfaccia di api 2.x Web e nell'uso delle normali chiamate via Web significa che si invia una chiamata a api Web che induce in errore i ficcanaso nel pensare che si stia davvero facendo qualcos'altro. È possibile utilizzare "POST" per recuperare davvero i dati, ad esempio.