【问题标题】:Consuming Asp.Net Core api locally在本地使用 Asp.Net Core api
【发布时间】:2016-10-17 03:06:09
【问题描述】:

我不知道我的 google 技能是在下降还是什么,但我似乎不知道如何使用本地 api。这可能最好用示例代码来解释...

所以我有一个简单的 api

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

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

还有一个视图控制器

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

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

所以在上面的视图控制器中,我调用 api 来获取所需的数据。然而,由于 api 控制器返回一个 IActionResult,ViewBad.Data 最终成为一个 IActionResult 对象。那么如何更改上面的内容以检查 api 调用的 StatusCode,如果需要处理错误,如果不需要...将数据放入 ViewBag,而不是整个结果对象。

我发现的每个示例似乎都让视图控制器返回一个视图,然后使用 ajax 调用来获取数据。虽然我理解并且可以轻松地做到这一点,但我不喜欢在不需要时对服务器进行 2 次往返的想法。

【问题讨论】:

  • 我明白不想再做一次往返,但为什么不正确使用 api 用来进行 db 调用的服务,然后在视图控制器中使用该服务来进行相同的 db 调用。
  • @Woot 我知道它可能更干净,我想它似乎是多余的。所以我们谈论的是一个返回实际数据对象的服务,一个返回结果对象(保存数据)的 api 控制器,以及一个返回视图(带有数据)的视图控制器。似乎有一种更有效的方法。

标签: asp.net asp.net-mvc asp.net-core actionresult asp.net-apicontroller


【解决方案1】:

你做错了。 如果您想在多个控制器之间重用代码,那么最好将其从 GetFoo 方法中移出,并将其放入共享类中,然后从其他任何地方访问它。

如果您想通过 REST 从视图中调用它,则使用 $.ajax 调用它 例如:

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

如果您想从另一个 C# 客户端访问它,请使用 HttpClient 类,例如:

 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();

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2023-03-12
    • 2020-07-11
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2017-01-06
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多