首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在.Net内核中访问API中的数据

如何在.Net内核中访问API中的数据
EN

Stack Overflow用户
提问于 2019-03-14 16:35:36
回答 1查看 211关注 0票数 1

我以前没有使用过.Net核心,但在MVC和实体框架方面有很多经验。我的项目有四个不同的文件夹,API、DTO、Repository和WEB。DTO文件夹有许多符合数据模型的模型文件。API文件夹有一个名为ReferenceDataController的Controller文件,如下所示

代码语言:javascript
运行
复制
[Route("api/[controller]")]
[ApiController]
public class ReferenceDataController : ControllerBase
{
    private readonly IReferenceDataRepository _repository;

    public ReferenceDataController(IReferenceDataRepository repository)
    {
        _repository = repository;
    }

    // GET api/values
    [HttpGet]
    public ActionResult<ReferenceData> GetReferenceData()
    {
        return _repository.GetReferenceData();
    }

我被告知,如果我调用这个GET方法,它将返回一个数据对象。如何从我的HomeController文件夹中调用API文件夹中的此方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-14 17:40:32

首先,在您的web项目中,您需要做一个小设置。添加如下类:

代码语言:javascript
运行
复制
public class ReferenceDataService
{
    private readonly HttpClient _httpClient;

    public ReferenceDataService(HttpClient httpClient)
    {
        _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
    }

    public async Task<List<ReferenceData>> GetReferenceDataAsync(CancellationToken cancellationToken = default)
    {
        using (var response = await _httpClient.GetAsync("/api/referencedata", cancellationToken))
        {
            if (response.IsSuccessStatusCode())
            {
                return await response.Content.ReadAsAsync<List<ReferenceData>>();
            }

            return null;
        }
    }
}

然后,在ConfigureServices in Startup.cs

代码语言:javascript
运行
复制
services.AddHttpClient<ReferenceDataService>(c =>
{
    c.BaseAddress = new Uri("https://api.example.com");
    // Use the actual URL for your API here. You also probably want to get this
    // from `Configuration` rather than hard-coding it.
});

最后,将ReferenceDataService注入您的HomeController

代码语言:javascript
运行
复制
public class HomeController : Controller
{
    private readonly ReferenceDataService _referenceDataService;

    public HomeController(ReferenceDataService referenceDataService)
    {
        _referenceDataService = referenceDataService ?? throw new ArgumentNullException(nameof(referenceDataService));
    }

    // In your action(s):
    // var data = await _referenceDataService.GetReferenceDataAsync(HttpContext.RequestAborted);
}

这里的代码又快又脏。你应该考虑改进的事情:

  1. 为您的服务类(Es)使用接口,即IReferenceDataService。这将使测试更容易。在ConfigureServices中: services.AddHttpClient(.) 然后,注入IReferenceDataService
  2. 您可以而且应该使用带有AddHttpClient的Polly扩展来支持重试和异常处理策略。至少,您肯定希望添加AddTransientHttpErrorPolicy: Services.AddHttpClient(.) .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(5),TimeSpan.FromSeconds(10) }); 这将处理临时错误,例如暂时无法连接到API,因为它是重新启动或其他什么。您可以在文档上找到更多的信息和更高级的配置可能性。
  3. 您应该使用单独的DTO类。为了简洁起见,我刚刚使用了您的(推定)实体类ReferenceData。相反,您应该始终使用自定义的DTO类,这些类只保存需要通过API获得的数据片段。通过这种方式,您可以控制诸如序列化和自定义验证方案之类的事情,而不会与实体类发生的情况发生冲突。此外,web项目只需要了解ReferenceDataDTO (或其他什么),这意味着您可以在API和web项目之间与DTO共享一个库,并将DAL完全排除在web项目之外。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55167763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档