Blazor Server 应用程序中进行 HTTP 请求

翻译自 Waqas Anwar 2021年5月4日的文章 《Making HTTP Requests in Blazor Server Apps》 [1]

Blazor Server 应用使用标准的 ASP.NET Core 应用程序,在服务端执行 .NET 代码。在 Blazor Server 应用程序中,我们可以像在 ASP.NET Core Web 应用程序中那样,使用相同的方式访问任意 .NET 库或服务端功能。这其中的一项功能是,使用 HTTP Client 实例向第三方 Web API 发送 HTTP 请求。在本教程中,我将向您展示创建 HTTP Client 实例的不同方法。另外,我还会向您展示如何在 Blazor Server 应用程序中使用第三方 API 来获取和显示数据。

下载源码[2]

第三方 Web API 概览

我们将开发一个 Blazor Server 应用程序,该应用允许用户在 Blazor 页面组件上输入国家代码和年份,然后我们将调用第三方 API 以获取指定国家和年份的公共假期列表。我们使用的第三方 API 是 Nager.Date[3],它是一个全球公共假期 API。

这是一个非常简单的 API,您可以轻松地在 Postman 中输入以下 URL 测试此 API。

https://date.nager.at/api/v2/PublicHolidays/2021/CN

该 API 的响应是 JSON 格式的公共假期列表,如下所示:

从 Blazor Sever 应用程序开始

在 Visual Studio 2019 中创建一个 Blazor Server 应用程序,并新建一个名为 Models 的文件夹。在 Models 文件夹中添加以下两个模型类,以映射上述 Holidays API 的请求和响应。

HolidayRequestModel.cs

public class HolidayRequestModel
{public string CountryCode { get; set; }public int Year { get; set; }
}

HolidayResponseModel.cs

public class HolidayResponseModel
{public string Name { get; set; }public string LocalName { get; set; }public DateTime? Date { get; set; }public string CountryCode { get; set; }public bool Global { get; set; }
}

接下来,在 Pages 文件夹中创建一个新的 Razor 组件 HolidaysExplorer.razor 及其代码隐藏文件 HolidaysExplorer.razor.cs。如果您想了解有关 Razor 组件和代码隐藏文件的更多知识,可以阅读我的文章《Blazor 组件入门指南》。

HolidaysExplorer.razor.cs

public partial class HolidaysExplorer
{private HolidayRequestModel HolidaysModel = new HolidayRequestModel();private List<HolidayResponseModel> Holidays = new List<HolidayResponseModel>();[Inject]protected IHolidaysApiService HolidaysApiService { get; set; }private async Task HandleValidSubmit(){Holidays = await HolidaysApiService.GetHolidays(HolidaysModel);}
}

HolidaysModel 字段是 HolidayRequestModel 类的一个实例,它将帮助我们创建一个简单的表单来向用户询问国家代码和年份。下面的代码片段显示了使用 HolidaysModel 对象创建的 Blazor 表单,其中 HandleValidSubmit 方法是使用 Blazor Form 的 OnValidSubmit 事件配置的,用户提交表单时该方法将被调用。

<EditForm Model="@HolidaysModel" OnValidSubmit="@HandleValidSubmit" class="form-inline"><label class="ml-2">Country Code:</label><InputText id="CountryCode" @bind-Value="HolidaysModel.CountryCode" class="form-control" /><label class="ml-2">Year:</label><InputNumber id="Year" @bind-Value="HolidaysModel.Year" class="form-control" /><button class="btn btn-primary ml-2" type="submit">Submit</button></EditForm>

Holidays 列表用来显示从第三方 API 返回的假期。我们需要使用一个 @foreach 循环迭代返回的假期来生成一个简单的 bootstrap 表格。

@if (Holidays.Count > 0)
{<table class="table table-bordered table-striped table-sm"><thead><tr><th>Date</th><th>Name</th><th>Local Name</th><th>Country Code</th><th>Global</th></tr></thead><tbody>@foreach (var item in Holidays){<tr><td>@item.Date.Value.ToShortDateString()</td><td>@item.Name</td><td>@item.LocalName</td><td>@item.CountryCode</td><td>@item.Global</td></tr>}</tbody></table>
}

HolidaysExplorer.razor 视图的完整代码如下:

HolidaysExplorer.razor

@page "/"
<h3>Holidays Explorer</h3>
<br /><EditForm Model="@HolidaysModel" OnValidSubmit="@HandleValidSubmit" class="form-inline"><label class="ml-2">Country Code:</label><InputText id="CountryCode" @bind-Value="HolidaysModel.CountryCode" class="form-control" /><label class="ml-2">Year:</label><InputNumber id="Year" @bind-Value="HolidaysModel.Year" class="form-control" /><button class="btn btn-primary ml-2" type="submit">Submit</button></EditForm><br />
@if (Holidays.Count > 0)
{<table class="table table-bordered table-striped table-sm"><thead><tr><th>Date</th><th>Name</th><th>Local Name</th><th>Country Code</th><th>Global</th></tr></thead><tbody>@foreach (var item in Holidays){<tr><td>@item.Date.Value.ToShortDateString()</td><td>@item.Name</td><td>@item.LocalName</td><td>@item.CountryCode</td><td>@item.Global</td></tr>}</tbody></table>
}

此时如果您运行该应用程序,您将看到一个不显示任何假期的简单 HTML 表单。这是因为方法 HandleValidSubmit 是空的,我们还未调用任何 API 来获取假期数据。

在 Blazor Server 应用程序中使用 IHttpClientFactory 创建 HttpClient

在 Blazor Server 应用程序中使用 HttpClient 请求第三方 API 有多种不同的方式,让我们从一个基础的示例开始,在该示例中我们使用 IHttpClientFactory 创建 HttpClient 对象。

在项目中创建一个 Services 文件夹,并创建如下的 IHolidaysApiService 接口。该接口只有一个方法 GetHolidays,它以 HolidayRequestModel 作为参数并返回 HolidayResponseModel 对象的列表。

IHolidaysApiService.cs

public interface IHolidaysApiService
{Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest);
}

接下来,在 Services 文件夹中创建一个 HolidaysApiService 类,实现上面的接口。

HolidaysApiService.cs

public class HolidaysApiService : IHolidaysApiService
{private readonly IHttpClientFactory _clientFactory;public HolidaysApiService(IHttpClientFactory clientFactory){_clientFactory = clientFactory;}public async Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest){var result = new List<HolidayResponseModel>();var url = string.Format("https://date.nager.at/api/v2/PublicHolidays/{0}/{1}", holidaysRequest.Year, holidaysRequest.CountryCode);var request = new HttpRequestMessage(HttpMethod.Get, url);request.Headers.Add("Accept", "application/vnd.github.v3+json");var client = _clientFactory.CreateClient();var response = await client.SendAsync(request);if (response.IsSuccessStatusCode){var stringResponse = await response.Content.ReadAsStringAsync();result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse,new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });}else{result = Array.Empty<HolidayResponseModel>().ToList();}return result;}
}

在上面的 GetHolidays 方法中,我们首先为第三方 API 创建了一个 URL,并将国家代码和年份参数添加到 URL 中。

var url = string.Format("https://date.nager.at/api/v2/PublicHolidays/{0}/{1}", holidaysRequest.Year, holidaysRequest.CountryCode);

接下来,我们创建了 HttpRequestMessage 对象并配置它以向第三方 API URL 发送 HTTP GET 请求。

var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add("Accept", "application/vnd.github.v3+json");

可以使用依赖注入 (DI) 请求一个 IHttpClientFactory,这正是我们将其注入到前面类的构造函数的原因。下面这行代码使用 IHttpClientFactory 创建了一个 HttpClient 实例。

var client = _clientFactory.CreateClient();

有了 HttpClient 对象之后,我们简单地调用它的 SendAsync 方法来发送一个 HTTP GET 请求。

var response = await client.SendAsync(request);

如果 API 调用成功,我们使用下面这行代码将其响应读取为字符串。

var stringResponse = await response.Content.ReadAsStringAsync();

最后,我们使用 JsonSerializer 类的 Deserialize 方法反序列化该响应。

result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });

在测试该应用程序之前,我们需要在 Startup.cs 文件中注册 HolidaysApiService 服务。我们还需要调用 AddHttpClient 方法注册 IHttpClientFactory

Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddRazorPages();services.AddServerSideBlazor();services.AddSingleton<IHolidaysApiService, HolidaysApiService>();services.AddHttpClient();
}

运行应用程序并在文本框中提供任意国家代码和年份。点击 Submit 按钮就会在后台调用我们的 GetHolidays 方法,然后您应该能看到如下所示的公共假期列表。

在 Blazor Server 应用程序中创建命名 HttpClient 对象

上面的示例适用于您正在重构现有的应用程序,希望在不影响整个应用程序的情况下,在某些方法中使用 IHttpClientFactory 创建 HttpClient 对象的场景。如果您要创建一个全新的应用程序,或者您想要将创建 HttpClient 对象的方式集中化,那么您必须使用命名 HttpClient

下面是创建命名 HTTP 客户端的好处:

  1. 我们可以为每个 HttpClient 命名,并在应用程序启动时指定与 HttpClient 相关的所有配置,而不是将配置分散在整个应用程序当中。

  2. 我们可以只配置一次命名的 HttpClient,并多次重用它调用一个特定 API 提供者的所有 API。

  3. 我们可以根据这些客户端在应用程序不同区域的使用情况,配置多个不同配置的命名 HttpClient 对象。

我们可以在 Startup.cs 文件的 ConfigureServices 方法中,使用前面用过的名为 AddHttpClient 方法指定一个命名的 HttpClient。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddRazorPages();services.AddServerSideBlazor();services.AddSingleton<IHolidaysApiService, HolidaysApiService>();services.AddHttpClient("HolidaysApi", c =>{c.BaseAddress = new Uri("https://date.nager.at/");c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");});
}

我们需要指定客户端的名称(例如 HolidaysApi),我们还可以配置如上所示的 BaseAddressDefaultRequestHeaders 和其他属性。

配置了命名 HttpClient 之后,我们可以使用相同的 CreateClient 方法在整个应用程序中创建 HttpClient 对象,不过这次我们需要指定想要创建哪个已命名的客户端(例如 HolidaysApi)。

HolidaysApiService.cs

public class HolidaysApiService : IHolidaysApiService
{private readonly IHttpClientFactory _clientFactory;public HolidaysApiService(IHttpClientFactory clientFactory){_clientFactory = clientFactory;}public async Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest){var result = new List<HolidayResponseModel>();var url = string.Format("api/v2/PublicHolidays/{0}/{1}", holidaysRequest.Year, holidaysRequest.CountryCode);var request = new HttpRequestMessage(HttpMethod.Get, url);var client = _clientFactory.CreateClient("HolidaysApi");var response = await client.SendAsync(request);if (response.IsSuccessStatusCode){var stringResponse = await response.Content.ReadAsStringAsync();result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse,new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });}else{result = Array.Empty<HolidayResponseModel>().ToList();}return result;}
}

我们在 CreateClient 方法中传递的名称(比如 HolidaysApi)必须与我们在 Startup.cs 文件中配置的名称一致。每次调用 CreateClient 方法时,都会为我们创建一个新的 HttpClient 实例。

另外,我们不需要在请求的 URL 中指定 API 主机名称,因为我们在 Startup.cs 文件中已经指定过基地址了。

再次运行应用程序并提供国家代码和年份值,您应该能看到以下公共假期列表。

在 Blazor Server 应用程序中创建类型化 HttpClient 对象

创建和使用 HttpClient 对象的第三种选择是使用类型化客户端。这种客户端具有以下好处:

  1. 它们提供与命名客户端同样的功能,但无需使用字符串作为键。

  2. 它们在使用客户端时提供智能感知和编译器帮助。

  3. 它们提供了一个单一的存储单元来配置特定的 HttpClient 并与之交互。例如,我们可以配置针对 Facebook API 的一个特定终端的一个类型化 HttpClient,而且该 HttpClient 可以封装使用该特定终端所需的所有逻辑。

  4. 它们与依赖注入 (DI) 一起使用,可以在需要的地方注入。

要配置类型化的 HTTPClient,我们需要在 Startup.cs 文件中使用相同的 AddHttpClient 方法注册它,但这一次,我们需要传递我们的服务名称 HolidaysApiService 作为它的类型。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddRazorPages();services.AddServerSideBlazor();services.AddSingleton<IHolidaysApiService, HolidaysApiService>();services.AddHttpClient<HolidaysApiService>();
}

在上面的代码片段中,HTTP 客户端和我们的服务 HolidaysApiService 都将注册为瞬时客户端和服务。这将允许我们在服务的构造函数中传递 HttpClient,如以下代码片段所示。请注意,HttpClient 是如何公开为服务的 public 属性的。

HolidaysApiService.cs

public class HolidaysApiService : IHolidaysApiService
{public HttpClient Client { get; }public HolidaysApiService(HttpClient client){client.BaseAddress = new Uri("https://date.nager.at/");client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");Client = client;}public async Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest){var result = new List<HolidayResponseModel>();var url = string.Format("api/v2/PublicHolidays/{0}/{1}",holidaysRequest.Year, holidaysRequest.CountryCode);var response = await Client.GetAsync(url);if (response.IsSuccessStatusCode){var stringResponse = await response.Content.ReadAsStringAsync();result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse,new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });}else{result = Array.Empty<HolidayResponseModel>().ToList();}return result;}
}

类型化客户端的配置也可以不在类型化客户端的构造函数中指定,而在注册期间在 Startup.cs 文件的 ConfigureServices 方法中指定。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{services.AddRazorPages();services.AddServerSideBlazor(); services.AddHttpClient<IHolidaysApiService, HolidaysApiService>(c =>{c.BaseAddress = new Uri("https://date.nager.at/");c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");});
}

如果您使用的是这种方式,则无需单独注册您的服务。您可以从 ConfigureServices 方法中删除下面这行代码。

services.AddSingleton<IHolidaysApiService, HolidaysApiService>();

可以将 HttpClient 对象密封在一个类型化客户端中,而不公开为 public 属性。然后,我们可以在服务内部的任意方法中使用这个客户端。

public class HolidaysApiService : IHolidaysApiService
{private readonly HttpClient _httpClient;public HolidaysApiService(HttpClient client){_httpClient = client;}public async Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest){var result = new List<HolidayResponseModel>();var url = string.Format("api/v2/PublicHolidays/{0}/{1}",holidaysRequest.Year, holidaysRequest.CountryCode);var response = await _httpClient.GetAsync(url);if (response.IsSuccessStatusCode){var stringResponse = await response.Content.ReadAsStringAsync();result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse,new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });}else{result = Array.Empty<HolidayResponseModel>().ToList();}return result;}
}

再次运行应用程序,并提供国家代码和年份值,您应该能够看到以下公共假期列表。

总结

在本文中,我介绍了在 Blazor Server 应用程序中创建和使用 HTTP 客户端的不同技术。这里提到的大部分技术也可以在 ASP.NET Core 应用程序中使用,因为 Blazor Server 应用程序是构建在 ASP.NET Core 基础架构之上的。在我的下篇文章 《Making HTTP Requests in Blazor WebAssembly Apps》 中,我将尝试介绍 HTTP 客户端在 Blazor WebAssembly 应用程序中的创建和使用。

相关阅读:

  • Blazor Server 和 WebAssembly 应用程序入门指南

  • Blazor 组件入门指南

  • Blazor 数据绑定开发指南

  • Blazor 事件处理开发指南

  • Blazor 组件之间使用 EventCallback 进行通信

  • Blazor 路由及导航开发指南

  • Blazor 模板化组件开发指南

  • Blazor Server 应用程序中进行 HTTP 请求(本文)


相关链接:

  1. https://www.ezzylearning.net/tutorial/making-http-requests-in-blazor-server-apps Making HTTP Requests in Blazor Server Apps ↩︎

  2. https://github.com/ezzylearning/BlazorServerWebAPIsDemo ↩︎

  3. https://date.nager.at/ ↩︎

作者 :Waqas Anwar
译者 :技术译民
出品 :技术译站(https://ITTranslator.cn/)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遍历属性动态展示列

为什么80%的码农都做不了架构师&#xff1f;>>> 前端根据后台返回json对象(Map)进行动态列展示。 javascript属性遍历和访问&#xff1a; //var obj {name:"h2do",age:0,sex:"男"}; function User(){this.name "h2do";this.age 0…

厉害了!这几位小学生竟然在艺术界掀起一阵风暴,简直是灵魂画手无疑.........

全世界只有3.14 % 的人关注了爆炸吧知识高能预警&#xff01;请查阅全文&#xff01;在孩子们的眼中&#xff0c;世间万物都被赋予了无限的想象力&#xff0c;而绘画是他们独特想法和思维的表达。一支小小的画笔&#xff0c;便能创造一个千奇百怪的世界。为鼓励孩子们拿起画笔&…

花开的声音 - 张靓颖

姓名&#xff1a;张靓颖 / Jane Zhang性别&#xff1a;女 地区&#xff1a;内地 职业&#xff1a;歌手 星座&#xff1a;天秤座 血型&#xff1a;O 身高&#xff1a;162cm张靓颖&#xff0c;中国女歌手&#xff0c;四川成都人。2005年参加湖南卫视…

基于事件驱动架构构建微服务第5部分:容器化(Web Api Core 和 SQL Server Linux)

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part5-dockerization-web-api-core-and-sql-server-linux/在本文中&#xff0c;我将谈谈web api和sql server linux数据库的容器化Web API将发布并上线&#xff0c;它需要…

爆笑!物理书上的照片能不能好好选选啊喂!

全世界只有3.14 % 的人关注了爆炸吧知识在物理书里&#xff0c;有各种物理大佬的照片。他们正襟危坐&#xff0c;他们不苟言笑&#xff0c;他们看起来就很“物理”。但是&#xff0c;知识君想说&#xff0c;谁不是个有血有肉的人啊&#xff1f;&#xff01;选照片的时候给我好好…

计算机网络体系结构概述

1.Internet结构 2.计算机网络的体系结构 1&#xff09;网路协议主要由以下三要素组成&#xff1a; 语法&#xff0c;即数据与控制信息的结构或格式&#xff1b; 语义&#xff0c;即需要发出何种控制信息&#xff0c;完成何种动作以及做出何种响应&#xff1b; 同步&#xff0c;…

.NET 6 全新指标 System.Diagnostics.Metrics 介绍

前言工友们, .NET 6 Preview 7 已经在8月10号发布了, 除了众多的功能更新和性能改进之外, 在 preview 7 版本中, 也新增了全新的指标API, System.Diagnostics.Metrics, 为了让应用能有更好的可观测性, 在之前的发布的.NET 5中, 也把 Activity 增强为 ActivitySource, 主要原因还…

42张动图带你走进神奇的物理世界,超震撼!

全世界只有3.14 % 的人关注了爆炸吧知识世界之大&#xff0c;无奇不有。生活中其实有许多神奇的物理化学现象。下面就一起来看看吧&#xff01;图片加载慢稍加等待即可哦~神 奇 的 物 理 反 应1.锤击被液氮冻上的康乃馨&#xff0c;求康乃馨的心理阴影面积。2.比重比空气还大的…

Linux优化之IO子系统监控与调优

Linux优化之IO子系统作为服务器主机来讲&#xff0c;最大的两个IO类型 &#xff1a;1.磁盘IO 2.网络IO这是我们调整最多的两个部分所在磁盘IO是如何实现的在内存调优中&#xff0c;一直在讲到为了加速性能&#xff0c;linux内核一般情况下都会尝试将磁盘上的慢速设备上的文件缓…

用3年时间破解学界200多年难题,年仅21岁的天才竟因谈了一场恋爱挂掉了.........

全世界只有3.14 % 的人关注了爆炸吧知识俗话说&#xff0c;英雄难过美人关&#xff0c;即便是智商超群的数学天才也毫不例外。破得了百年的世界难题&#xff0c;却解不开一个小小的爱情谜团......没错&#xff0c;这位为情所困的数学天才&#xff0c;便是今天的主人公——伽罗瓦…

投影变换与视口变换

一些说明&#xff1a; 0. 投影变换&#xff1a;描述如何指定视景体(viewing volume)的形状和方向。视口变换&#xff1a;解释如何控制三维模型坐标到屏幕坐标的变换。 1. 无论是透视投影还是平行投影&#xff08;正交投影&#xff09;&#xff0c;只有在视景体中的物体才可见。…

java 按钮设置图片_Java中如何设置带图片按钮的大小

在java部分需要用到图形界面编程的项目中&#xff0c;经常会使用图片设置对按钮进行美化&#xff0c;但是使用时会出现一个很麻烦的问题&#xff0c; 按照方法&#xff1a;JButton jb1 new JButton();jb1.setBounds(0, 0, 25, 20);ImageIcon ii new ImageIcon("images/x…

JAVA 异常库

为什么80%的码农都做不了架构师&#xff1f;>>> 1.java.lang.NumberFormatException: multiple points已解决 多线程方法中使用了共享变量SimpleDateFormat&#xff0c;报如下错误&#xff1a; java.lang.NumberFormatException: multiple points at sun.misc.Floa…

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换

WPF ComboBox 使用 ResourceBinding 动态绑定资源键并支持语言切换独立观察员 2021 年 8 月 23 日我们平常在 WPF 中进行资源绑定操作&#xff0c;一般就是用 StaticResource 或者 DynamicResource 后面跟上资源的 key 这种形式&#xff0c;能满足大部分需求。但是有的时候&am…

你一直憋着的那个屁,放出来时真的有人知道吗?我先告诉你憋着不放的屁会到哪去……...

全世界只有3.14 % 的人关注了爆炸吧知识制作团队制作人 超模君编剧 恐恐恐插画 杨羊羊友情出演 超模君 想增加更多的奇怪知识&#xff1f;带你入学↓↓↓关注“爆炸吧知识”日增怪知识&#xff01;

Android中View绘制流程

2019独角兽企业重金招聘Python工程师标准>>> 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的&#xff0c;该函数做的执行过程可简单概况为 根据之前设置的状态&#xff0c;判断是否需要重新计算视图大小(measure)、是否重新需要安置视图的…

从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式

本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 从零开始学习jQuery (五) 事件与事件对象 从零开始学习jQuery (六) jQuery…

java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例

所谓有权图&#xff0c;就是图中的每一条边上都会有相应的一个或一组值。通常情况下&#xff0c;这个值只是一个数字如&#xff1a;在交通运输网中&#xff0c;边上的权值可能表示的是路程&#xff0c;也可能表示的是运输费用(显然二者都是数字)。不过&#xff0c;边上的权值也…

[原]一步一步自己制作弹出框

说到javascript弹出框的制作,将其实现步骤分开&#xff0c;其实很容易。下面&#xff0c;将拆分页面弹出框的制作步骤。首先&#xff0c;准备编辑工具(废话)&#xff0c;其实&#xff0c;您可以使用notepad..嘿嘿。弹出框的组成结构&#xff1a; 1.一个页面遮罩层。 2.一个di…

那些你从未见过的神奇物理化学实验,今天全给你整理了!

全世界只有3.14 % 的人关注了爆炸吧知识1.电荷吸引水流2.比空气重的六氟化硫六氟化硫&#xff08;SF6&#xff09;&#xff0c;法国两位化学家Moissan和Lebeau于1900年合成的人造惰性气体&#xff0c;具有良好的电气绝缘性能及优异的灭弧性能&#xff0c;是一种优于空气和油之间…