Blazor 使用 HttpClient 调用 Web API 教程
技术百科
幻夢星雲
发布时间:2025-12-31
浏览: 次 Blazor中调用Web API需正确配置HttpClient服务、处理跨域、管理生命周期及错误;推荐使用命名或类型化客户端,通过IHttpClientFactory注入,结合GetFromJsonAsync/PostAsJsonAsync发送请求,并确保后端启用CORS。
Blazor 中使用 HttpClient 调用 Web API 是最常用的数据交互方式,关键在于正确配置服务、处理跨域、管理生命周期,并做好错误应对。
注册并注入 HttpClient 服务
Blazor WebAssembly 和 Blazor Server 的注册方式略有不同,但都推荐使用命名客户端(Named Client)或类型化客户端(Typed Client)来提升可维护性。
- 在
Program.cs(.NET 6+)中注册命名客户端:
builder.Services.AddHttpClient("MyApi", client =>
{
client.BaseAddress = new Uri("https://api.example.com/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
});- 在组件中通过
[Inject]获取:
@inject IHttpClientFactory HttpClientFactory
@code {
private HttpClient _httpClient;
protected override void OnInitialized()
{
_httpClient = HttpClientFactory.CreateClient("MyApi");
}
}
更推荐直接注入 IHttpClientFactory 而非 HttpClient 实例,避免 DNS 变更或连接泄漏问题。
发送 GET 请求并解析 JSON
调用 REST API 获取数据时,通常用 GetFromJsonAsync 方法,它自动反序列化响应体。
- 定义对应的数据模型(如
WeatherForecast.cs) - 在组件中发起请求:
private Listforecasts = new();
private bool isLoading = true;
protected override async Task OnInitializedAsync()
{
try
{
forecasts = await _httpClient.GetFromJsonAsync>("weatherforecast");
}
catch (HttpRequestException ex)
{
// 处理 4xx/5xx 响应
Console.WriteLine($"请求失败:{ex.Message}");
}
finally
{
isLoading = false;
}
}
注意:确保 API 返回的 JSON 结构与 C# 类型完全匹配(字段名大小写、嵌套结构等),否则反序列化会静默失败或为 null。
处理 POST 请求与表单提交
向 API 提交数据常用 PostAsJsonAsync(),它自动设置 Content-Type: application/json 并序列化对象。
- 构造请求数据对象(如
NewTodo) - 调用方法并检查响应状态码:
var newTodo = new NewTodo { Title = "买牛奶", IsCompleted = false };
var response = await _httpClient.PostAsJsonAsync("t
odos", newTodo);
if (response.IsSuccessStatusCode)
{
var createdTodo = await response.Content.ReadFromJsonAsync();
todos.Add(createdTodo);
}
else
{
var error = await response.Content.ReadAsStringAsync();
Console.WriteLine($"创建失败:{error}");
} 若需上传文件或混合表单数据,改用 MultipartFormDataContent 手动构建请求体。
跨域(CORS)与本地开发注意事项
Blazor WebAssembly 运行在浏览器沙箱中,受同源策略限制。调用非同源 API 必须由后端启用 CORS。
- .NET Web API 示例(
Program.cs):
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowBlazorApp", policy =>
{
policy.WithOrigins("https://localhost:5001") // Blazor WASM 默认地址
.AllowAnyMethod()
.AllowAnyHeader();
});
// ...
app.UseCors("AllowBlazorApp");
- 开发阶段也可用代理(如
dev-server proxy或ASP.NET Core 代理中间件)绕过浏览器 CORS 检查 - Blazor Server 不受浏览器 CORS 限制(请求由服务器发出),但仍需注意后端网络可达性
基本上就这些 —— 配置好客户端、选对方法、处理好异常和跨域,调用 Web API 就很稳了。
# ai
# 后端
# 表单
# 推荐使用
# 不受
# 而非
# 关键在于
# 浏览器
# app
# 客户端
# js
# json
# dns
# 对象
# c#
# 序列化
# .net
# NULL
# 状态码
# 中间件
# 表单提交
# 跨域
# nas
# rest api
# 但仍
# 但都
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11怎么关闭系统声音_Win11系统提示音静
- Windows10如何更改日期格式_Win10区域
- 作用域操作符会影响性能吗_php静态调用性能分析【
- Win11怎么更改系统语言为中文_Windows1
- Mac怎么查看活动监视器_理解Mac进程和资源占用
- c++的STL算法库find怎么用 在容器中查找指
- 如何更改Windows资源管理器的默认启动位置?(
- 如何在 Go 中正确初始化结构体中的 map 字段
- Win11如何设置电源计划_Win11电源计划优化
- Windows10怎么卸载预装软件_Windows
- Windows蓝屏BAD_POOL_HEADER故
- 如何使用Golang实现容器自动化运维_Golan
- Mac的“预览”如何合并多个PDF_Mac文件处理
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- Win11怎么关闭VBS安全性_Windows11
- Win10路由器怎么隐藏ssid Win10隐藏w
- Win11局域网共享怎么设置 Win11文件夹网络
- Win11怎么查看激活状态_查询Windows 1
- Python字符串操作教程_切片拼接与格式化详解
- Windows10系统怎么查看防火墙状态_Win1
- Windows怎样拦截QQ浏览器广告_Window
- C++如何使用Qt创建第一个GUI窗口?(入门教程
- Win11如何更改用户账户文件夹名称 Win11修
- Win11如何设置系统语言_Win11系统语言切换
- Windows蓝屏错误0x00000018怎么处理
- mac怎么打开终端_MAC终端Terminal使用
- PythonWeb前后端整合项目教程_FastAP
- php打包exe如何加密代码_防反编译保护方法【技
- Windows7怎么找回经典开始菜单_Window
- Win11怎么关闭触摸键盘图标_Windows11
- Win10怎样卸载自带Edge_Win10卸载Ed
- c++如何实现一个高性能的环形队列(Ring Bu
- Win11怎么关闭搜索历史_Win11清除任务栏搜
- 如何在Golang中引入测试模块_Golang测试
- Win11怎么关闭自动调节亮度 Win11禁用内容
- 如何在Golang中操作嵌套切片指针_Golang
- 如何关闭Win10自动更新更新_Win10系统自动
- Win10怎样设置多显示器_Win10多显示器扩展
- 为什么Go需要go mod文件_Go go mod
- Windows如何查看和管理已安装的字体?(字体文
- php转exe用什么工具打包快_高效打包软件推荐【
- 如何使用Golang捕获测试日志_Golang t
- Win11快速助手怎么用_Win11远程协助连接教
- Win11怎么关闭专注助手 Win11关闭免打扰模
- Win10如何更改任务栏高度_Windows10解
- 如何在Golang中使用container/hea
- Win11怎么退出高对比度模式_Win11取消反色
- 本地php环境打开php文件直接下载_浏览器解析p
- 如何使用Golang实现Web表单数据绑定_自动映
- Win11怎么修复系统文件_使用sfc命令修复Wi

odos", newTodo);
QQ客服