【问题标题】:How should I be calling APIs from Blazor我应该如何从 Blazor 调用 API
【发布时间】:2022-01-24 03:41:37
【问题描述】:

有多个关于如何使用 Blazor 调用 API 的示例,例如

var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/dotnet/AspNetCore.Docs/branches");
request.Headers.Add("Accept", "application/vnd.github.v3+json");
request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

var client = ClientFactory.CreateClient();

var response = await client.SendAsync(request);

if (response.IsSuccessStatusCode)
{
     using var responseStream = await response.Content.ReadAsStreamAsync();
     branches = await JsonSerializer.DeserializeAsync<IEnumerable<GitHubBranch>>(responseStream);
}

await this.httpClient.GetFromJsonAsync<TblMenus[]>("https://xxxxx.com/BLZ/api/GETData/x,x,x,x");

对我来说,这些似乎相当于使用

$.get( "ajax/test.html", function( data ) {
  $( ".result" ).html( data );
  alert( "Load was performed." );
});

这就是它的工作原理,但它与您以现代方式使用 API 的方式相去甚远。特别是如果您要构建的不仅仅是 hello world 脚本。

如果您查看任何 TS/JS 框架(Angular、React、Vue),您会发布某种 API 规范(OpenAPI/Swagger),然后从中生成强类型的客户端代码(使用 typescript 或任何您喜欢的方式) .每次更新 API 时都没有强制转换或检查所有代码,因为它只是封装在客户端类中,并在您更新生成的客户端时更新。

所以我的问题是这样的。 存在哪些选项,或者是否有任何示例说明如何使用 Blazor 而无需手动编写 API 调用或将它们嵌入 HTML 代码(几乎所有现代 JS/TS 框架工作都已远离)。

澄清一下,我不是在寻找意见,而是在寻找如何以更持久的方式在 Blazor 中封装、生成或使用 API 的示例,不会让 HTTP 调用遍布整个应用程序。

【问题讨论】:

  • 如果您想要自动生成 C# 代码的东西,我发现 this。就个人而言,我发现这通常会导致必须编辑多个文件并且不会加快开发速度。不过我是一个人工作,而不是在一个组织中。

标签: blazor blazor-webassembly


【解决方案1】:

这么简单的东西都可以用。

IApiService 是一个单例服务。你可以在任何需要的地方注入它。

using ...

namespace App.Shared.Data.Services
{
    public class ApiService : IApiService
    {
        private readonly HttpClient httpClient;

        public ApiService(HttpClient httpClient)
        {
            this.httpClient = httpClient;
        }

        public static StringContent PrepareStringContent(object obj)
        {
            return new(JsonSerializer.Serialize(obj), Encoding.UTF8, "application/json");
        }

        public async Task<bool> DeleteProblem(Guid problemid)
        {
            using (HttpResponseMessage responseMessage = await httpClient.DeleteAsync($"api/admin/deleteproblem/{problemid}"))
            {
                return responseMessage.IsSuccessStatusCode;
            }
        }
        ...
    }
}

我使用PrepareStringContent 方法在POST 请求、PUT 等需要HttpContent 的地方以JSON 形式发送对象。

【讨论】:

    猜你喜欢
    • 2020-12-10
    • 2017-06-16
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多