一步一步从微信小程序获取asp.net Core API的数据

前面我们说过,如何使用微信小程序获取asp.net的数据,这里我们继续介绍如何获取asp.net core api的数据。两者之间还是有一些差别的。本篇博文旨在详细介绍如何一步一步从微信小程序获取asp.net Core API的数据。

文章目录

  • 一、建立并了解asp.net core web API
    • 1、建立工程
    • 2、关于两个重要的文件
    • 3、API的访问测试
    • 4、自己来写一个控制器类
    • 5、设置字段的名称大小写
    • 7、添加过滤器
    • 8、默认值的设定
  • 二、微信小程序获取数据
    • 1、准备数据
    • 2、建立小程序工程
    • 3、页面版面布局
    • 4、获取数据和页面加载事件
    • 5、上下翻页
    • 6、总体的效果为:

文章原出处:
https://blog.csdn.net/haigear/article/details/143208403

一、建立并了解asp.net core web API

1、建立工程

有webapi经验的可以略过本章节,首先,建立一个asp.net core web api项目,比如我们起名为websiteAPItest,下面

在这里插入图片描述

2、关于两个重要的文件

建立好工程,下面正式开工了。进入我们建立好的工程,我们最需要关注的就是这两个文件了。首先我们就从这两个文件入手来了解。
在这里插入图片描述
从上图,我们注意到,最应该注意到的就是红色箭头所指的两个文件,因为就是他们两个具体负责我们API对外部访问所提供的数据,我们不要忘记,我们之所以要建立这个API工程,目的就是对外提供数据访问。
观察两个文件,我们发现,都很普通,尤其第一个,就是一个简单的类,或者我们在MVC中称之为Model的类,还一个在controllers下,名称叫做WeatherForecastController.cs,一看这个名字你肯定已经猜测到它就是MVC中称之为Controller的类。那么还有一个View的类呢?其实我们的微信小程序前端就是这个View了!
来,我们具体来看看代码:
WeatherForecast.cs

namespace websiteAPItest
{
    public class WeatherForecast
    {
        public DateOnly Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string? Summary { get; set; }
    }
}

很显然,上面的WeatherForecast.cs文件平淡无奇,就是一个普通带有几个属性的类。下面我们看看
WeatherForecastController.cs

using Microsoft.AspNetCore.Mvc;

namespace websiteAPItest.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

这个类倒是有些新的东西,每个方法前都有一个特性描述,类的前面也有特性描述。除此没有其他特别了,至于这里实现了一个枚举接口的Get方法,也不是controller类必须的。其实随便的一个添加了特性描述的方法的controller类都是可以的。后面我们将自己建立一个最简单的controller类。

文章原出处:
https://blog.csdn.net/haigear/article/details/143208403

3、API的访问测试

预览效果我们会发现,会呈现一个web端的swagger访问页面,这里出现的就是我们在项目中对应的weatherforecast的接口。
在这里插入图片描述
打开这个接口我们可以通过普通的http协议来访问,也就是说,我们可以在web浏览器上直接输入地址访问,点开get栏的下拉图标,我们会发现Request URL中有一个url地址,我们试试访问一下:
在这里插入图片描述
在这里插入图片描述
这就是我们通过url访问得到的jason格式的数据,这些数据我们就可以直接拿到微信小程序中去使用了。

4、自己来写一个控制器类

我们来自己编写一个控制器类,添加一个类,选择API控制器-空:
在这里插入图片描述

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace websiteAPItest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet(Name = "Hello")]
        public string SayHello()
        {
            return "welcome to asp.net core web api";
        }
    }
   
}

在这里插入图片描述
文章原出处:
https://blog.csdn.net/haigear/article/details/143208403

在这里插入图片描述

5、设置字段的名称大小写

前面我们应该发现了一个小问题,那就是所有的属性在jason文件中都是小写,我们实际在使用的时候如果是需要区别大小写的,那就需要我们去一个个修正,尤其是与数据库访问结合的时候就会出错,那太麻烦了,这里微软也给出了一个设置的方法来解决这样的问题。
我们来看看没有修正之前的状况:
在这里插入图片描述
首先在依赖中引入Microsoft.AspNetCore.Mvc.NewtonsoftJson,
在这里插入图片描述
同时,在程序中引入 然后在program.cs中将builder.Services.AddControllers()x修改为下面的代码即可。
using Microsoft.AspNetCore.Mvc.NewtonsoftJson;

builder.Services.AddControllers().AddNewtonsoftJson(options => { 

options.SerializerSettings.ContractResolver=new DefaultContractResolver();

});

修改后,显示效果如下:
在这里插入图片描述

7、添加过滤器

我们在获取一个刚刚初始化类的实例对象时往往获得的都是空值,但对于我们的小程序而言,可能就比较麻烦,好多的空值会引起错误,或者也缺乏辨识度,比如字符串类型的API给出的默认值就是string,我们来看看默认设定默认值之前是什么样的效果:
如,我这里有一个PersonalInfo类,我们实现了最简单的控制器,代码如下:

using System;
namespace websiteAPItest.Models
{

    public class PersonalInfo
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public string Gender { get; set; }
            public string Email { get; set; }
            public string PhoneNumber { get; set; }
            public DateTime BirthDate { get; set; }
            public string Address { get; set; }
            public string Occupation { get; set; }
            public string Nationality { get; set; }
        }
}

控制器代码

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using websiteAPItest.Models;

namespace websiteAPItest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class PersonalInfoController : ControllerBase
    {
        [HttpGet(Name ="getPersonList")]
        
        public IList<PersonalInfo> GetPersonalInfoList(int sid,int eid)
        {
            // 假设这里有一些数据获取逻辑,可以根据实际情况修改
            List<PersonalInfo> personList = new List<PersonalInfo>();
            for (int i = sid; i <= eid; i++)
            {
                personList.Add(new PersonalInfo { Name = $"Person {i}", Age = i % 10 + 20 });
            }
            return personList;
        }
    }
}

在这里插入图片描述

很显然,这里出现了很多的string,这不是我们需要的。我们现在增加一个过滤器来看看:
在这里插入图片描述

显然,那成堆的string消失了。那么我们怎么办到的呢?这就是使用了过滤器,过滤器的增加分为两步:
1、在builder.Services.AddSwaggerGen中添加option

builder.Services.AddSwaggerGen(option =>
{

   option.SchemaFilter<CommSchemaFilter>();

});

2、添加一个过滤器类并实现其接口(过滤器名称自己定),这里我们名称为CommSchemaFilter

using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

namespace websiteAPItest.Assist
{
    public class CommSchemaFilter : ISchemaFilter
    {
        public void Apply(OpenApiSchema schema, SchemaFilterContext context)
        {
            if (schema == null) return;
            var objectSchema = schema;
            foreach (var property in objectSchema.Properties)
            {
                if (property.Value.Type == "string" && property.Value.Default == null)
                {
                    property.Value.Default = new OpenApiString("");
                }
                if (property.Key == "pageIndex")
                {
                    property.Value.Default = new OpenApiInteger(1);
                }
                else if (property.Key == "pageSize")
                {
                    property.Value.Default = new OpenApiInteger(10);
                }
            }
        }
    }
}

8、默认值的设定

虽然过滤掉了那些string,但我们为了防止空值导致程序错误,我们还是需要为刚刚实例化的对象添加默认值,添加默认值的办法有很多,比如在过滤器中用语句判断,这个实现起来比较灵活,但麻烦。下面我们就特性标注的方法来实现它。也就是说在模型类中为每个属性添加特性标注。如:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace websiteAPItest.Models
{
    public class PersonalInfo
    {
        [Required]
        [StringLength(50)]
        [DefaultValue("张三")]
        public string Name { get; set; }

        [Required]
        [Range(0, 150)]
        [DefaultValue(24)]
        public int Age { get; set; }

        [Required]
        [StringLength(10)]
        [DefaultValue("男")]
        public string Gender { get; set; }

        [Required]
        [EmailAddress]
        [DefaultValue("zhangsan@example.com")]
        public string Email { get; set; }

        [Required]
        [Phone]
        [DefaultValue("13788888888")]
        public string PhoneNumber { get; set; }

        [Required]
        [DataType(DataType.Date)]
        [DefaultValue("2000-01-01")]
        public DateTime BirthDate { get; set; }

        [Required]
        [StringLength(100)]
        [DefaultValue("张家口市张家镇张家村张家冲21号")]
        public string Address { get; set; }

        
        [StringLength(50)]
        [DefaultValue("码农")]
        public string Occupation { get; set; }

        [Required]
        [StringLength(30)]
        [DefaultValue("China")]
        public string Nationality { get; set; }
    }
}

效果如下:
在这里插入图片描述
好了,数据基本处理好了,那接下来是我们如何用微信小程序获取到我们需要的数据了。至于我们需要读取数据库中的内容来提供给微信小程序来访问,我们可以后面专门来讲。因为数据里面的内容也算不少了,比如说sqlsugar等ORM框架

文章原出处:
https://blog.csdn.net/haigear/article/details/143208403

二、微信小程序获取数据

1、准备数据

我先偷了个懒,没有使用数据库,我们首先对刚刚的控制器进行了一些改造,令其随机生成了一些个人信息,以供后面的测试使用(当然,你也可以把一些数据写死,这也是没有问题的,只是没有什么新鲜感而已),访问的效果是这样:
在这里插入图片描述
显然有点男女不分,但我们先不管它了,我们继续我们的小程序。

2、建立小程序工程

有过小程序基础的可以直接跳过阅读本节。而且我们也直接建立一个新的页面开始。
在这里插入图片描述
我们在pages文件夹中添加一个新的页面我们叫做PersonalInfo,点击编译旁边的下拉箭头,增加一个编译模式,目的在于把当前编辑仿真的页面修改为刚刚新建立的页面:
在这里插入图片描述

3、页面版面布局

<view class="infoContainer">
   <view class="title">个人信息详情</view>
  <view class="info">
    <view class="titem">姓名:{{currentInfo.Name}}</view>
    <view class="titem">年龄:{{currentInfo.Age}}</view>
    <view class="titem">性别:{{currentInfo.Gender}}</view>
    <view class="titem">邮箱:{{currentInfo.Email}}</view>
    <view class="titem">电话:{{currentInfo.PhoneNumber}}</view>
    <view class="titem">出生日期:{{currentInfo.BirthDate}}</view>
    <view class="titem">地址:{{currentInfo.Address}}</view>
    <view class="titem">职业:{{currentInfo.Occupation}}</view>
    <view class="titem">国籍:{{currentInfo.Nationality}}</view>
  </view>
</view>
  <view class="btn">
    <button bindtap="prevInfo" class="bitem">上一个</button>
    <button bindtap="nextInfo" class="bitem">下一个</button>
  </view>

文章原出处:
https://blog.csdn.net/haigear/article/details/143208403

4、获取数据和页面加载事件

事件主要是页面加载的时候我们通过api获取数据后放置在personalInfoList中,默认的游标我们设置为currentIndex0,onload中

data: {
    personalInfoList: [],
    currentIndex: 0
  },
onLoad: function () {
    // 发起网络请求获取数据
    wx.request({
      url: 'http://localhost:5043/api/PersonalInfo',
      data: {
        sid: 3,
        eid: 6
      },
      success: res => {
        this.setData({
          personalInfoList: res.data,
          currentIndex: 0 // 设置当前索引为第一个元素
        });
        // 如果有数据,显示第一个元素的信息
        if (res.data.length > 0) {
          this.setData({
            // 分别设置各个属性到对应的数据绑定变量中
            'currentInfo.Name': res.data[0].Name,
            'currentInfo.Age': res.data[0].Age,
            'currentInfo.Gender': res.data[0].Gender,
            'currentInfo.Email': res.data[0].Email,
            'currentInfo.PhoneNumber': res.data[0].PhoneNumber,
            'currentInfo.BirthDate': res.data[0].BirthDate,
            'currentInfo.Address': res.data[0].Address,
            'currentInfo.Occupation': res.data[0].Occupation,
            'currentInfo.Nationality': res.data[0].Nationality
          });
        }
      }
    });
  },

这里使用 wx.request获取数据,然后将数据res.data存储在数组中personalInfoList,没有微信小程序基础的情参考我前面的博文,这里不再逐一讲解。

5、上下翻页

上下翻页比较简单,就是利用index来改变访问数组的游标。这里大家看看代码就可以了。没有什么技术含量:

prevInfo: function () {
    let index = this.data.currentIndex;
    index = index > 0? index - 1 : this.data.personalInfoList.length - 1;
    this.setData({
      currentIndex: index
    });
    // 更新显示的信息
    this.setData({
      'currentInfo.Name': this.data.personalInfoList[index].Name,
      'currentInfo.Age': this.data.personalInfoList[index].Age,
      'currentInfo.Gender': this.data.personalInfoList[index].Gender,
      'currentInfo.Email': this.data.personalInfoList[index].Email,
      'currentInfo.PhoneNumber': this.data.personalInfoList[index].PhoneNumber,
      'currentInfo.BirthDate': this.data.personalInfoList[index].BirthDate,
      'currentInfo.Address': this.data.personalInfoList[index].Address,
      'currentInfo.Occupation': this.data.personalInfoList[index].Occupation,
      'currentInfo.Nationality': this.data.personalInfoList[index].Nationality
    });
  },
  nextInfo: function () {
    let index = this.data.currentIndex;
    index = index < this.data.personalInfoList.length - 1? index + 1 : 0;
    this.setData({
      currentIndex: index
    });
    // 更新显示的信息
    this.setData({
      'currentInfo.Name': this.data.personalInfoList[index].Name,
      'currentInfo.Age': this.data.personalInfoList[index].Age,
      'currentInfo.Gender': this.data.personalInfoList[index].Gender,
      'currentInfo.Email': this.data.personalInfoList[index].Email,
      'currentInfo.PhoneNumber': this.data.personalInfoList[index].PhoneNumber,
      'currentInfo.BirthDate': this.data.personalInfoList[index].BirthDate,
      'currentInfo.Address': this.data.personalInfoList[index].Address,
      'currentInfo.Occupation': this.data.personalInfoList[index].Occupation,
      'currentInfo.Nationality': this.data.personalInfoList[index].Nationality
    });
  },
 get currentInfo() {
    return this.data.personalInfoList[this.data.currentIndex];
  }

6、总体的效果为:

在这里插入图片描述
对了,样式我没有特别的去美化,也没有用vant这类UI框架,只为展示一下数据获取,所以,这里就简单的写了一些CSS,代码如下:

/* pages/PersonalInfo/PersonalInfo.wxss */
.infoContainer
{
   display: flex;
   flex-direction: column;
   justify-content: left;
   padding-top: 140rpx;
   margin-left: 80rpx;
}
.title
{
   font-size: large;
   font-weight: 800;
   margin-bottom: 80rpx;
   justify-content: center;
}
.titem
{
  padding: 20rpx;
}
.btn
{
  display: flex;
  flex-direction: row;
  justify-content: left;
  padding-top: 40rpx;

}
.bitem
{
  width: 60rpx; /* 减小宽度 */
  height: 80rpx; /* 减小高度 */
 
   background-color: rgb(236, 248, 248);
   padding: 20rpx;
   margin: 80rpx;
  
}

文章随时可能更新,感兴趣的情关注文章原出处:
https://blog.csdn.net/haigear/article/details/143208403

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

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

相关文章

RabbitMQ集群搭建及使用

1. 概述 前提条件&#xff1a;linux服务器下已经安装好了docker服务。 本文档将搭建一个三台RabbitMQ的集群&#xff0c;包括三个RabbitMQ容器安装在同一服务器和三台不同的服务器。 2. 集群搭建 在一台服务器上创建三个RabbitMQ容器。 2.1.1. 创建容器 执行以下命令创建三…

合理利用IPIDEA代理IP,优化数据采集效率!

一、前言 在全球化与信息化交织的当代社会&#xff0c;数据已成为驱动商业智慧与技术革新的核心引擎。网络&#xff0c;作为信息汇聚与交流的枢纽&#xff0c;不仅是人们获取知识的窗口&#xff0c;更是商业活动与技术创新的广阔舞台。在这个信息繁荣的时代&#xff0c;Python…

Docker 实践与应用举例教程:从入门到精通

Docker 实践与应用举例教程&#xff1a;从入门到精通 引言 在现代软件开发中&#xff0c;Docker 已成为一种不可或缺的工具。它通过容器化技术简化了应用的部署、管理和扩展&#xff0c;极大地提高了开发和运维的效率。本文将详细介绍 Docker 的基本概念、安装步骤、常用命令…

开放式耳机哪个品牌音质好?音质最好的开放式耳机推荐!

如今&#xff0c;开放式耳机市场日益繁荣&#xff0c;成为了众多音乐爱好者和追求舒适佩戴体验者的新宠。然而&#xff0c;面对琳琅满目的品牌和产品&#xff0c;消费者往往陷入选择的困境。音质&#xff0c;作为衡量一款耳机优劣的关键因素&#xff0c;更是备受关注。究竟哪个…

反编译华为-研究功耗联网监控日志

摘要 待机功耗中联网目前已知的盲点&#xff1a;App自己都不知道的push类型的被动联网、app下载场景所需时长、组播联网、路由器打醒AP。 竞品 策略 华为 灭屏使用handler定时检测&#xff08;若灭屏30分钟内则周期1分钟&#xff0c;否则为2分钟&#xff09;&#xff0c;检…

【Unity踩坑】UWP应用未通过Windows应用认证:API不支持

在将Unity项目导出为XAML类型的UWP项目后&#xff0c;通过Visual Studio打包成功&#xff0c;但在进行Windows应用认证时结果是Failed。 其中的错误是某些dll里用到了Windows SDK不支持的API。 本次问题中涉及到的具体dll有两个&#xff1a;gilzoide-sqlite-net.dll和D3D12Cor…

【Linux网络】传输层协议UDP与TCP

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 传输层 再谈端口号 ​编辑 端口号范围划分 认识知名端口号(Well-Know Port Number) netstat pidof UDP协议 UDP协议端格式 UDP的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议…

开源实时数仓的构建

设计计思路 基本思路 开源数据平台的设计思路是通过 Flink SQL Batch、StartRocks SQL 、StartRocks物化视图 的能力实现一个离线任务的开发&#xff1b;使用 DolphinScheduler 进行离线工作流编排和调度&#xff1b;通过 Flink CDC 和 Flink SQL 实现流处理能力&#xff0c;进…

Redis+Lua限流的四种算法

1. 固定窗口&#xff08;Fixed Window&#xff09; 原理&#xff1a; 固定窗口算法将时间划分为固定的时间段&#xff08;窗口&#xff09;&#xff0c;比如 1 秒、1 分钟等。在每个时间段内&#xff0c;允许最多一定数量的请求。如果请求超出配额&#xff0c;则拒绝。 优点…

软工毕设开题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

文档解析与向量化技术加速 RAG 应用落地

在不久前举办的 AICon 全球人工智能开发与应用大会上&#xff0c;合合信息智能创新事业部研发总监&#xff0c;复旦博士常扬从 RAG 应用落地时常见问题与需求&#xff08;文档解析、检索精度&#xff09;出发&#xff0c;分享了针对性的高精度、高泛化性、多版面多元素识别支持…

Linux系统下串口AT指令控制EC20连接华为云物联网平台

一、前言 在当今万物互联的时代背景下&#xff0c;物联网技术的快速发展极大地推动了智能化社会的构建。作为其中的关键一环&#xff0c;设备与云端平台之间的通信变得尤为重要。本文介绍如何在Linux操作系统环境下&#xff0c;利用串口通信来实现EC20模块与华为云物联网平台的…

Word中Normal.dotm样式模板文件

Normal.dotm文档 首先将自己电脑中C:\Users\自己电脑用户名\AppData\Roaming\Microsoft\Templates路径下的Normal.dotm文件做备份&#xff0c;在下载本文中的Normal.dotm文件&#xff0c;进行替换&#xff0c;重新打开word即可使用。 字体样式如下&#xff08;可自行修改&#…

基于opencv答题卡识别判卷

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 **《------往期经典推荐------》**项目名称 1.【基于DDPG算法的股票量化交易】 2.【卫星图像道路检测DeepLabV3Plus模型】 3…

蓝桥杯 单片机 DS1302和DS18B20

DS1302 时钟 时钟试题 常作为实验室考核内容 控制三个引脚 P17 时钟 P23输入 P13复位 其他已经配置好 寄存器原理 定位地址 0x80地址 固定格式 0x57 5*107*1 57 小时写入格式 不同 首位区分 A上午 P下午 0为24小时制 1为12小时制 写入8小时 0x87 //1000 7 十二小时制 7…

H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;最近一直被测试…

Django+Vue全栈开发旅游网项目首页

一、前端项目搭建 1、使用脚手架工具搭建项目 2、准备静态资源&#xff08;图片资源&#xff09; 将准备好的静态资源拖至public目录下 3、调整生产项目结构 公共的样式 公共js 首页拆解步骤 ①分析页面结构 标题、轮播图、本周推荐、精选景点、底部导航 ②新建页面组…

VAE中的“变分”什么

写在前面 VAE&#xff08;Variational Autoencoder&#xff09;&#xff0c;中文译为变分自编码器。其中AE&#xff08;Autoencoder&#xff09;很好理解。那“变分”指的是什么呢?—其实是“变分推断”。变分推断主要用在VAE的损失函数中&#xff0c;那变分推断是什么&#x…

第十二部分 Java Stream、File

第十二部分 Java Stream、File 12.1 Java Stream流 12.1.1体验Stream流 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素把集合中所有以"张"开头的元素存储到一个新的集合把"张"开头的集合中的长度为3的元素存…

OpenTelemetry 实际应用

介绍 OpenTelemetry“动手”指南适用于想要开始使用 OpenTelemetry 的人。 如果您是 OpenTelemetry 的新手&#xff0c;那么我建议您从OpenTelemetry 启动和运行帖子开始&#xff0c;我在其中详细介绍了 OpenTelemetry。 OpenTelemetry开始改变可观察性格局&#xff0c;它提供…