一步一步从asp.net core mvc中访问asp.net core WebApi

"从asp.net core mvc中访问asp.net core WebApi"看到这个标题是不是觉得很绕口啊,但的确就是要讲一讲这样的访问。前面我们介绍了微信小程序访问asp.net core webapi(感兴趣的童鞋可以看看前面的博文有关WEBAPI的搭建),这里我们重点不关心如何搭建asp.net core webapi,因为前面有好几篇博文都已经讲到它了。这里我们重点要说的是如何使用.net core mvc来访问webapi。
注明:我这里使用的是vs2022 17.11.5版,使用了newtonsofot.json做解析,使用了SqlSugar数据库orm框架。

文章目录

  • 一、准备webapi
    • 1、准备模型
    • 2、准备控制器(api端)
  • 二、.net web MVC端的设计
    • 1、controller控制器的设计
    • 2、viewer视图页的设计
  • 三、program的配置
    • (一)、关于httpclient
      • 1.`System.Net.Http.HttpClient`服务的作用
      • 2. 在访问Web API过程中的作用
    • (二)、program.cs配置httpclient
  • 四、展示信息的视图页
    • 1、将控制器数据传递给视图的原理
    • 2、传递给视图的两种方法
      • a、粗暴显示
      • b、使用Viewbag和viewdata
      • b、使用模型

请关注文章原出处: https://haigear.blog.csdn.net/article/details/143609860

一、准备webapi

1、准备模型

webapi的模型我们这里准备好了,模型类的代码中我们简单的设置了四个属性,如下代码:

  [SugarTable("Book")]
  public class Book
  {
      [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
      public int Id { get; set; }
      public string ?Context { get; set; }
      public string ?Desc { get; set; }
      public bool Status { get; set; }
  }

如果你想像我一样偷懒,让ID号为自增长类型,而且是主键的话,记得加上这句话

 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]

如果拆成两句话来说:[SugarColumn(IsIdentity = true)] 表示设置为自增,[SugarColumn(IsPrimaryKey = true)] 表示设置为主键。不要忘记设置了,否则在你提交的表单中如果id为空,数据库就不会自己为你补上,那么你的主键的唯一性就会导致报错,因为你的id号肯定会在第二条记录加入的时候就开始重复。

2、准备控制器(api端)

api端的控制器主要是负责接受mvc端发送的get、put、delete、update四种请求的,少一个咱们的请求都会找不到对应负责的“部门”来服务,所以咱们都把他们实现一次,代码如下:

using Microsoft.AspNetCore.Mvc;
using WEBAPI.Models;

namespace WEBAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class BookController : ControllerBase
    {
        private readonly QbusterContext _context;
        public BookController(QbusterContext context)
        {
            _context = context;
        }
        // 获取所有书本
        [HttpGet]
        public IActionResult GetBooks()
        {
            var books = _context.Db.Queryable<Book>().ToList();
            return Ok(books);
        }

        // 添加书本
        [HttpPost]
        public IActionResult AddBook(Book book)
        {       
            _context.Db.Insertable(book).ExecuteCommand();
            return Ok(book.Id);
        }

        // 更新书本
        [HttpPut]
        public IActionResult UpdateBook(Book book)
        {
            _context.Db.Updateable(book).ExecuteCommand();
            return Ok();
        }

        [HttpGet("{id}")]
        public IActionResult GetBookById(int id)
        {
            // 在这里实现获取特定Book的逻辑
            var book = _context.Db.Queryable<Book>().Where(b => b.Id == id).First();
            if (book == null)
            {
                return NotFound();
            }
            return Ok(book);
        }

        // 删除书本
        [HttpDelete("{id}")]
        public IActionResult DeleteBook(int id)
        {
            _context.Db.Deleteable<Book>(id).ExecuteCommand();
            return Ok();
        }
    }
}

请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860

二、.net web MVC端的设计

这里应该是我们的重点章节了,我们在设计之前应该很清楚一点,那就是我们的MVC其实可以是没有Model部分的,为什么呢?因为我们的数据来自API端,当然,你也可以设计一个完全和API端一模一样的模型。其实,我们完全可以直接将API的model直接引入即可(假定你是可以拿到api的dll,或者api和MVC就是在一台机器开发的话)。

1、controller控制器的设计

我们来看最基础最基本的控制器,这个控制器仅仅实现的就是在index方法中利用httpclient发送一个get请求的指令的功能:

using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using QBuster_API.Models;

namespace WebAppToAPI.Controllers
{
    public class BookController : Controller
    {
        private readonly HttpClient _httpClient;

        public BookController(HttpClient httpClient)
        {
            _httpClient = httpClient;
        }

        public async Task<IActionResult> Index()
        {
            var response = await _httpClient.GetAsync("http://localhost:5049/api/Book");
            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                // 处理返回的数据
                return View();
            }
            else
            {
                // 处理错误情况
                return BadRequest();
            }
        }
    }
}

如果我们单独在浏览器中访问api的地址:http://localhost:5049/api/Book我们会得到下面的返回结果,这些也正是我们要最后要呈现在视图中的内容。
在这里插入图片描述
如果我们的控制器没有问题,将来控制器的content中就可以通过断点看到上面的内容,也就是这句话中:

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

这句话完成了读取工作。

2、viewer视图页的设计

上面我们的控制器应该算作是完成了它的使命,拿到了从api请求过来的数据了。接下来就要看视图的了。视图的工作就是把上面的内容显示在页面上。这里我们只为展示原理,所以,我们一开始并不需要在视图文件中写过多少内容进去。先看看它是否能够运行,首先我们建立一个新的视图页面,名称和控制器中的index方法名一致,也叫做index.cshtml:

@*
    For more information on enabling MVC for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
*@
@{

}

<p>这访问api的测试页面</p>

特别简单,我们的目的就是让它能够无错误的显示即可。运行试试:
在这里插入图片描述
哦豁,不那么简单吧。其实也简单,问题出在没有在program中配置好httpclient而已。
请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860

三、program的配置

前面两个章节只是完成了基本的“基础”准备,剩下的就是我们如何通过配置来使其可以正常访问。
要想访问api,我们这里就必须在program.cs中注册httpclient服务,否则无法解析 System.Net.Http.HttpClient 类型的服务。

(一)、关于httpclient

这里索性就把httpclient介绍一下,避免我们有小白路过因不了解它而迷路(开玩笑)。

1.System.Net.Http.HttpClient服务的作用

  • 发送HTTP请求
    • HttpClient是用于发送HTTP请求的主要工具。它可以发送各种类型的HTTP请求,如GETPOSTPUTDELETE等。例如,在一个简单的场景中,如果要从一个新闻网站获取新闻数据,你可以使用HttpClient发送一个GET请求到新闻网站的API端点。
    • 它提供了一种简单且灵活的方式来构建和发送请求。可以通过设置请求头(Headers)来指定诸如内容类型(Content - Type)、授权信息(如Authorization)等。例如,在访问需要身份验证的API时,可以在请求头中添加身份验证令牌,如下所示:
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "your_token");
    
  • 处理HTTP响应
    • 当发送请求后,HttpClient会接收并处理HTTP响应。它可以获取响应状态码(如200 OK404 Not Found500 Internal Server Error等),这对于判断请求是否成功非常重要。例如,如果响应状态码是200,表示请求成功,你可以继续处理响应内容。
    • 可以读取响应内容,响应内容可以是多种格式,如JSON、XML、纯文本等。如果响应是JSON格式的数据,你可以使用System.Text.Json(在.NET中)等库将其反序列化,例如:
    var response = await client.GetAsync("https://api.example.com/data");
    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();
        var data = System.Text.Json.JsonSerializer.Deserialize<YourDataType>(content);
    }
    

2. 在访问Web API过程中的作用

  • 建立连接和通信
    • 它是客户端(如ASP.NET Core MVC应用)和Web API之间建立通信的桥梁。当应用需要从Web API获取数据(如获取用户信息、产品列表等)或者向Web API发送数据(如提交订单、更新用户资料等)时,HttpClient负责发起请求并等待响应。
  • 实现请求的定制化
    • 可以根据Web API的要求定制请求。例如,有些Web API可能要求在请求头中包含特定的版本号或者自定义的元数据。HttpClient可以轻松地设置这些请求头来满足API的要求。
    • 对于POSTPUT请求,可以设置请求体(RequestBody)的内容。如果要向Web API发送一个新的用户注册信息,HttpClient可以将包含用户姓名、密码等信息的对象序列化为JSON格式(或其他格式)并作为请求体发送,如下所示:
    var user = new User
    {
        Name = "John Doe",
        Password = "password123"
    };
    var json = System.Text.Json.JsonSerializer.Serialize(user);
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    var response = await client.PostAsync("https://api.example.com/users", content);
    
  • 错误处理和重试机制
    • 当请求出现错误时,如网络故障或者API返回错误状态码,HttpClient可以作为基础来构建错误处理机制。可以根据响应状态码来采取不同的措施,如显示友好的错误信息给用户或者进行重试。
    • 例如,可以在收到401 Unauthorized状态码时,提示用户重新登录,或者在收到500 Internal Server Error状态码时,等待一段时间后进行重试。

(二)、program.cs配置httpclient

我们还清楚的记得,上面我们在写好控制器后并不能成功的访问我们的api端。为什么呢?就是这里没有配置好httpclient。下面是配置的代码:

//前面省去五万字
builder.Services.AddControllersWithViews();
builder.Services.AddHttpClient("MyHttpClient", client =>
{
    client.BaseAddress = new Uri("http://localhost:80000/api");
});
var app = builder.Build();
//后面省去五万字

配置好后,我们就可以来访问了。看看效果:
在这里插入图片描述
是的,就是要的这个效果,尽管它比较简单。所以,我们接下来就可以考虑将从api上获取的数据完整的显示在页面上了。认认真真的设计一个视图。
请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860

四、展示信息的视图页

1、将控制器数据传递给视图的原理

在ASP.NET Core MVC 中,从控制器传递数据到视图有多种方法。在上述代码中,你可以将content数据存储在一个视图模型(ViewModel)或者ViewBag/ViewData中,然后在视图中访问它。为了小白能够流畅阅读后面的内容,这里首先介绍一下他们两个吧。

  1. ViewBagViewData在ASP.NET Core MVC中的位置和本质
    • ViewBagViewData是ASP.NET Core MVC框架提供的用于在控制器和视图之间传递数据的机制。作用就是为MVC框架内部的对象来管理数据传递。
    • ViewData的底层实现
      • ViewData是一个ViewDataDictionary类型的对象,它本质上是一个字典,用于存储键值对。在ASP.NET Core MVC的内部机制中,它是在控制器和视图之间传递数据的基础结构之一。
      • 这个字典存储的数据可以是各种类型,如字符串、整数、对象等。当控制器将数据存储在ViewData中时,实际上是将数据作为键值对添加到ViewDataDictionary中。例如,在控制器中这样操作:
      public IActionResult Index()
      {
          ViewData["Message"] = "Hello, World!";
          return View();
      }
      
      • 这里ViewData存储了一个键为Message,值为Hello, World!的键值对。
    • ViewBag的底层实现和与ViewData的关系
      • ViewBag是一个动态类型的属性,它在底层是基于ViewData实现的。当你访问ViewBag的属性时,实际上是在访问ViewDataDictionary中的元素。
      • ASP.NET Core MVC利用C#的动态语言特性,让ViewBag看起来像是一个具有动态属性的对象。例如,在控制器中:
      public IActionResult Index()
      {
          ViewBag.Message = "Hello, World!";
          return View();
      }
      
      • 这与使用ViewData的效果是类似的,在底层,ViewBag.Message的赋值操作实际上是在ViewDataDictionary中添加一个键为Message的值。不过,由于ViewBag是动态类型,没有编译时检查,所以在使用过程中需要更加小心,避免运行时的类型错误。
    • 它们在MVC框架中的作用位置
      • 在控制器中,数据被添加到ViewDataViewBag中,然后在视图渲染过程中,MVC视图引擎(如Razor视图引擎)会读取这些数据。当视图(.cshtml文件)被渲染时,它可以访问存储在ViewDataViewBag中的数据,从而实现控制器到视图的数据传递。例如,在Razor视图中:
      @ViewData["Message"]
      或者
      @ViewBag.Message
      
      • 这样就可以获取控制器传递过来的数据并在视图中显示出来。它们是MVC框架中用于在不同层次(控制器和视图)之间灵活传递数据的工具,是框架设计的一部分,没有存储在特定的文件中,而是在请求处理和视图渲染的过程中发挥作用。

2、传递给视图的两种方法

a、粗暴显示

视图页中,我们就直接粗暴的拿来用,强制将各种字段类型转化为string来显示。只要将控制器中的content直接作为view的参数返回给视图即可,代码如下:

var content = await response.Content.ReadAsStringAsync();
return View(content);

既然是粗暴的行为,那结果自然是惨不忍睹,就会出现报错,但能够看到数据显示:
在这里插入图片描述
看来我们还是得文明一点,做个有文化的文明人啊。

b、使用Viewbag和viewdata

使用他们就显得文明一些,毕竟他们是asp.net core内置的传递工具,官方的人啊,我们来看代码:
在控制器中,将content首先装入viewbag中

public async Task<IActionResult> Index()
{
    var response = await _httpClient.GetAsync("https://example.com/api/data");
    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();
        ViewBag.Content = content;
        return View();
    }
    else
    {
        // 处理错误情况
        return BadRequest();
    }
}

然后在视图页中显示,页面代码如下:

<div>
    @ViewBag.Content
</div>

在这里插入图片描述

果然文明了些,但是还差一点“优雅”,这里我们来给视图的代码给修改一下:

@using QBuster_API.Models;
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>

<body>
    <div class="container">
        @if (!string.IsNullOrEmpty(ViewBag.Content))
        {
            var data = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Book>>(ViewBag.Content);
            <table class="table table-striped">
                <thead>
                    <tr>
                        <!-- 根据你的数据结构替换以下表头 -->
                        <th>内容</th>
                        <th>描述</th>
                        <th>状态</th>
                        <!-- 添加更多表头 -->
                    </tr>
                </thead>
                <tbody>
                    @foreach (var item in data)
                    {
                        <tr>
                            <!-- 根据你的数据结构替换以下表格内容 -->
                            <td>@item.Context</td>
                            <td>>@item.Desc</td>
                            <td>>@item.Status</td>
                            <!-- 添加更多表格内容 -->
                        </tr>
                    }
                </tbody>
            </table>
        }
    </div>

    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>

</html>

在这里插入图片描述
算了,上面的这种Viewbag的方式也就这样了。来看看使用模型的方式吧。

b、使用模型

使用模型是最好的选择,但最不方便,需要你建立一个视图,当然,我们首先还是在控制器中修改一下代码,主要是将content装入视图中:

public async Task<IActionResult> Index()
{
    var response = await _httpClient.GetAsync("https://localhost/api/data");
    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();
        var viewModel = new BookViewModel
        {
            Content = content
        };
        return View(viewModel);
    }
    else
    {
        // 处理错误情况
        return BadRequest();
    }
}

为了省事,我们把模型类(最简单的模型类)偷偷的丢在了控制器后面(和控制器同一个文件)

 public class MyViewModel
 {
     private string _content;
     public string Content
     {
         get { return _content; }
         set
         {
             if (value == null)
             {
                 throw new ArgumentNullException("Content不能为null");
             }
             _content = value;
         }
     }

然后就是我们的视图页面了。首先看个粗暴一些的,这和前面的Viewbag的效果一样,视图也的代码:

@using WebAppToAPI.Controllers;
@model MyViewModel;
<div>
    @Model.Content
</div>

注意,这里要引入controller文件夹,不然MyViewModel
运行效果:
在这里插入图片描述

要美化一下,列成表格,方法和Viewbag的做法一样,这里就不赘述了。

好了,感兴趣的同学可以继续关注我的博客。文章可能随时更新,请关注文章原出处:https://haigear.blog.csdn.net/article/details/143609860

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系列】VNC安装ssh后,ssh无法登录

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

温度虽寒,其道犹变:OpenAI接口之温度参数设置为0,为何每次回复仍有不确定性?

问题描述 调用openai API&#xff0c;使用templature 0&#xff0c;每次返回的内容仍有一些不同 >>> client OpenAI( ... api_keyapi_key, ... base_urlapi_base) #第一次尝试 >>> response client.chat.completions.create(mo…

【软件测试】需求的概念和常见模型(瀑布、螺旋、增量、迭代)

1. 什么是需求 在企业中&#xff0c;经常会听到&#xff1a;用户需求和软件需求 用户需求&#xff1a;没用经过合理的评估&#xff0c;通常就是一句话&#xff08;开发一个五彩斑斓的黑&#xff09;软件需求&#xff1a;开发人员和测试人员执行工作的依据 1.2 软件需求 在工…

食品配送管理系统(源码+文档+部署+讲解)

食品配送管理系统是成品商业化项目&#xff0c;系统可基于源码二开。 系统概述 餐饮食品配送&#xff0c;包含配送人APP、下单APP、管理端等&#xff0c;实现订餐、配餐&#xff0c;用于食品店、中央厨房等订餐、团餐业务 本项目名称为食品配送系统&#xff0c;是针对食品配…

./bin/mindieservice_daemon启动成功

接MindIE大模型测试及报错Fatal Python error: PyThreadState_Get: the function must be called with the GIL held,-CSDN博客经过调整如下红色部分参数&#xff0c;昇腾310P3跑起来了7b模型&#xff1a; rootdev-8242526b-01f2-4a54-b89d-f6d9c57c692d-qjhpf:/home/apulis-de…

我谈维纳(Wiener)复原滤波器

Rafael Gonzalez的《数字图像处理》中&#xff0c;图像复原这章内容几乎全错。上篇谈了图像去噪&#xff0c;这篇谈图像复原。 图像复原也称为盲解卷积&#xff0c;不处理点扩散函数&#xff08;光学传递函数&#xff09;的都不是图像复原。几何校正不属于图像复原&#xff0c…

精选 Top10 开源调度工具,解锁高效工作负裁自动化

在大数据和现代 IT 环境中&#xff0c;任务调度与工作负载自动化&#xff08;WLA&#xff09;工具是优化资源利用、提升生产效率的核心驱动力。随着企业对数据分析、实时处理和多地域任务调度需求的增加&#xff0c;这些工具成为关键技术。 本文将介绍当前技术发展背景下的Top …

高效视觉方案:AR1335与i.MX8MP的完美结合

方案采用NXP i.MX8MP处理器和onsemi AR1335图像传感器&#xff0c;i.MX8MP集成四核Cortex-A53、NPU及双ISP技术。AR1335是一颗分辨率为13M的CMOS传感器。它使用了先进的BSI技术&#xff0c;提供了超高的分辨率和出色的低光性能&#xff0c;非常适合于需要高质量图像的应用。此外…

Ubuntu+ROS 机械臂拾取和放置

官方链接&#xff1a;https://github.com/skumra/baxter-pnp 1.下载并安装 SDK 依赖项 sudo apt-get install python-wstool python-rosdep 2.创建新的 catkin 工作区 mkdir -p ~/ros_ws/src cd ~/ros_ws/src 3.使用 wstool 下载 rosinstall 文件并将其复制到 Catkin 工作区…

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…

基于Spring Boot的船运物流管理系统的设计与实现,LW+源码+讲解

摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定船运物流管理系统的总体功能模块。然后&#xff0…

威联通Docker Compose搭建NAS媒体库资源工具NAS Tools

文章目录 一、环境配置1-1 需要的配件1-2 环境安装及配置注意:获取PUID/PGID1-3 目录位置准备总结,这里我们要做5件事备注:Docker无法下载解决办法二、登录配件,进行配件连接和配置2-1 jackett设置2-2 qBittorrent设置!!!设置文件下载地址2-3 jellyfin设置2-4 NASTools设…

Spring Boot - 扩展点 EnvironmentPostProcessor源码分析及真实案例

文章目录 概述EnvironmentPostProcessor 作用EnvironmentPostProcessor 实现和注册创建类并实现接口注册到 Spring Boot常见应用场景 源码分析1. EnvironmentPostProcessor 接口定义2. 扩展点加载流程3. 加载 EnvironmentPostProcessor 实现类4. EnvironmentPostProcessor 执行…

【eNSP】企业网络架构链路聚合、数据抓包、远程连接访问实验(二)

一、实验目的 网络分段与VLAN划分&#xff1a; 通过实验了解如何将一个大网络划分为多个小的子网&#xff08;VLAN&#xff09;&#xff0c;以提高网络性能和安全性。 VLAN间路由&#xff1a; 学习如何配置VLAN间的路由&#xff0c;使不同VLAN之间能够通信。 网络设备配置&am…

Python 智取京东商品详情:代码秘籍大公开

介绍使用 Python 获取京东商品详情的背景和意义&#xff0c;强调其在数据收集和分析中的重要性。 &#xff08;一&#xff09;数据收集的需求 在当今数字化的商业环境中&#xff0c;对京东商品详情数据的需求日益增长。市场调研人员需要这些数据来了解不同产品的市场份额、价格…

[C++]——位图与布隆过滤器

目录 一、前言 二、正文 1.位图 1.1 位图概念 1.2 位图的实现 1.2.1 Set 1.2.2 ReSet 1.2.3 Text 1.3 位图的应用 2.布隆过滤器 2.1布隆过滤器的提出 2.2 布隆过滤器概念 2.3 布隆过滤器的实现 2.3.1布隆过滤器的插入 2.3.2 布隆过滤器的查找 2.3.3 布隆过滤器…

工具收集 - java-decompiler / jd-gui

工具收集 - java-decompiler / jd-gui 参考资料 用法&#xff1a;拖进来就行了 参考资料 https://github.com/java-decompiler/jd-gui 脚本之家&#xff1a;java反编译工具jd-gui使用详解

Spark的容错机制:persist持久化机制checkpoint检查点机制区别

persist持久化机制&#xff1a; 作用&#xff1a;将RDD的数据缓存到内存或磁盘中&#xff0c;以便在后续操作中重复使用&#xff0c;减少计算开销。特点&#xff1a; 灵活性高&#xff1a;可以指定不同的存储级别&#xff08;如仅内存、内存和磁盘、仅磁盘等&#xff09;。 数…

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面&#xff0c;下载Elasticsearch 在如下页面选择Elasticsearch版本&#xff0c;点击download按钮&#xff0c;进入下载页面 右键选择自己操作系统对应的版本&#xff0c;复制下载链接 然后通过wget命令下载Elastics…

Flink API 的层次结构

Apache Flink 提供了多层 API&#xff0c;每层 API 针对不同的抽象层次和用途&#xff0c;使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明&#xff1a;