0

Je ne sais pas si mes compétences google diminuent ou quoi, mais je n'arrive pas à comprendre comment consommer une API locale. Cela peut être mieux expliqué avec des exemples de code ...Consommer Asp.Net Core API localement

J'ai donc simple api

public class FooApiController : Controller 
{ 
    public IActionResult GetFoo(int id) 
    { 
     if (id == 0) 
      return BadRequest(); 

     var data = ... do db access 
     return Ok(data); 
    } 
} 

et un contrôleur de vue

public class FooController : Controller 
{ 
    public IActionResult Foo() 
    { 
     var api = new FooApiController(); 
     var data = api.GetFoo(1); 

     ViewBag.Data = data; 
     return View(); 
    } 
} 

Ainsi, dans le contrôleur de vue ci-dessus j'appelle les api obtenir les données nécessaires. Cependant, étant donné que le contrôleur api renvoie un IActionResult, ViewBad.Data finit par être un objet IActionResult. Alors, comment puis-je changer ce qui précède pour vérifier le StatusCode de l'appel api, gérer les erreurs si besoin est, et sinon ... mettre juste les données dans le ViewBag, au lieu de l'objet résultat entier.

Chaque échantillon que j'ai trouvé semble avoir le contrôleur de vue revenir une vue qui utilise ensuite un appel ajax pour obtenir les données. Bien que je comprenne et que je puisse facilement faire cela, je n'aime pas l'idée de faire 2 allers-retours au serveur quand je n'en ai pas besoin.

+0

Je comprends ne pas vouloir faire un autre aller-retour, mais pourquoi pas juste un service que l'api utilise pour faire l'appel db et ensuite utiliser ce service dans le contrôleur en vue de faire le même appel db. – Woot

+0

@Woot Je sais que c'est probablement plus propre, je suppose que cela semblait redondant. Nous parlons donc d'un service qui renvoie les objets de données réels, d'un contrôleur api qui renvoie un objet résultat (contenant les données) et d'un contrôleur de vue qui renvoie une vue (avec les données). Il semble juste qu'il existe un moyen plus efficace. –

Répondre

1

Vous le faites mal. Si vous souhaitez réutiliser le code parmi plusieurs contrôleurs, il est préférable de le déplacer de la méthode GetFoo et de le placer dans une classe partagée pour y accéder depuis n'importe quel autre endroit.

Si vous voulez l'appeler d'une vue à travers REST, puis appelez à l'aide .ajax $ ex:

$.ajax('FooApi/GetFoo/5',function(data){alert(data);}); 

Si vous voulez y accéder d'un autre C# client, puis utilisez la classe HttpClient, ex:

HttpClient client = new HttpClient(); 
client.BaseAddress = new Uri("http://localhost"); 
client.DefaultRequestHeaders.Accept.Clear(); 
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
HttpResponseMessage response = await client.PostAsJsonAsync("api/FooApi/GetFoo", 3); 
response.EnsureSuccessStatusCode();