首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

入门Vue+.NET 8 Web Api记录(一)

编程知识
2024年07月25日 12:59

做自己感觉有意思的或者能解决自己需求的项目作为入门,我觉得是有帮助的,不会觉得那么无聊。

一个最简单的前后端分离项目应该是怎么样的?

我觉得就是前端有个按钮,点击向后端发送一个get请求,获取到数据后,将数据显示在前端上。

结合最近感兴趣的SemanticKernel,有了做这样的Demo学习的想法,用户点击按钮,返回一句夸人的话。

Vue:

前后端分离的一个很明显的好处就是,你可以使用多个前端使用同一个后端服务,比如我也用Avalona做了一个这样的客户端应用,也可以共用这个后端服务,如下所示:

开始使用.NET 8 Web Api

选择Web Api模板:

image-20240725092622106

其他信息:

image-20240725093117690

这里有几点可以注意:

配置https是什么意思?

配置HTTPS是指在网络服务器上设置和启用安全超文本传输协议(HTTPS)。HTTPS是HTTP的安全版本,它在HTTP协议的基础上添加了SSL/TLS加密层,以确保数据在客户端和服务器之间的传输过程中是加密的,从而保护数据的机密性和完整性。

启用OpenAPI支持是什么意思?

OpenAPI(以前称为Swagger规范)是一种用于描述、生成、消费和可视化RESTful Web服务的规范。它允许开发者定义API的各个方面,包括路径、操作、请求参数、响应和认证方法。通过使用OpenAPI规范,开发者可以更容易地创建、维护和使用API文档,从而提高开发效率和API的可理解性。

启用OpenAPI支持是指在软件项目中集成和配置OpenAPI规范,以便能够生成、使用和展示符合OpenAPI标准的API文档。这意味着项目将能够利用OpenAPI的各种工具和生态系统来简化API的设计、开发、文档编写和测试过程。

不使用顶级语句是什么意思?

在C#中,"不使用顶级语句"(Not using top-level statements)是指在编写代码时不采用C# 9.0引入的顶级语句特性。

使用控制器是什么意思?

控制器是MVC(Model-View-Controller)中的Controller,在Web API开发中,"使用控制器"(Using Controllers)是指采用一种设计模式,其中API的逻辑被组织到称为"控制器"的类中。控制器负责处理HTTP请求、执行相应的业务逻辑,并返回HTTP响应。

为了维护方便与规范化,自己再加上一层Model、一层Services:

image-20240725130842155

现在想一下自己想添加什么服务,想法是使用SemanticKernel接入大语言模型,当我们请求的时候让它返回一句夸人的话。

SemanticKernel现在就知道它是为了让LLM快速集成进我们的应用的就行了。

安装SemanticKernel:

image-20240725131101780

在Services中添加SemanticKernelService:

 public class SemanticKernelService
 {
     private readonly Kernel _kernel;
     public SemanticKernelService()
     {
         var handler = new OpenAIHttpClientHandler();
         var builder = Kernel.CreateBuilder()
        .AddOpenAIChatCompletion(
           modelId: "Qwen/Qwen2-7B-Instruct",
           apiKey: "你的apikey",
           httpClient: new HttpClient(handler));
         _kernel = builder.Build();
     }

     public async Task<string> Praiseyuzai()
     {
         var skPrompt = """                           
                       你是一个夸人的专家,回复一句话夸人。                         
                       你的回复应该是一句话,不要太长,也不要太短。                               
                       """;
         var result = await _kernel.InvokePromptAsync(skPrompt);
         var str = result.ToString();
         return str;
     }

 }

可能很多人看SemanticKernel的介绍会觉得只能用OpenAI的模型,其实只要兼容了OpenAI格式的在线模型都可以的,本地大模型的话也是可以通过实现接口实现接入的,本文选择的平台是硅基流动下的Qwen/Qwen2-7B-Instruct模型,免费使用。

由于不是OpenAI需要将请求转发到硅基流动提供的Api上,需要在模型中添加OpenAIHttpClientHandler类如下所示:

 public class OpenAIHttpClientHandler : HttpClientHandler
 {
     protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
     {
         UriBuilder uriBuilder;
         switch (request.RequestUri?.LocalPath)
         {
             case "/v1/chat/completions":
                 uriBuilder = new UriBuilder(request.RequestUri)
                 {
                     // 这里是你要修改的 URL
                     Scheme = "https",
                     Host = "api.siliconflow.cn",
                     Path = "v1/chat/completions",
                 };
                 request.RequestUri = uriBuilder.Uri;
                 break;
         }

         HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

         return response;
     }

我们与大语言模型聊天,就是在提供一个Prompt,这里我们的Prompt如下:

  var skPrompt = """                           
                       你是一个夸人的专家,回复一句话夸人。                         
                       你的回复应该是一句话,不要太长,也不要太短。                               
                       """;

大语言模型会根据这个Prompt给我们回复。

现在项目结构如下所示:

image-20240725131839064

现在将构造的这个服务,添加到依赖注入容器中:

image-20240725131923106

更规范的做法应该是传入一个接口和一个实现类,本次入门直接传入实现类即可。

现在来看看控制器怎么写?

先看看模板自带的一个控制器:

 [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();
     }
 }

模仿它的样子写一个控制器:

[ApiController]
[Route("[controller]")]
public class SemantickernelController : ControllerBase
{
    private readonly ILogger<SemantickernelController> _logger;
    private readonly SemanticKernelService _semanticKernelService;
    
    public SemantickernelController(ILogger<SemantickernelController> logger,SemanticKernelService semanticKernelService)
    {
        _logger = logger;
        _semanticKernelService = semanticKernelService;
    }

    [HttpGet]
    public async Task<string> Get()
    {
        _logger.LogInformation($"执行Praise请求 时间:{DateTime.Now}");
        var str = await _semanticKernelService.Praise();
        return str;
    }
 
}

在构造函数中注入了我们刚刚注册的服务类。

[HttpGet]
public async Task<string> Get()
{
   _logger.LogInformation($"执行Praise请求 时间:{DateTime.Now}");
   var str = await _semanticKernelService.Praise();
   return str;
}

这个的写法其实也不规范,后面可以使用ActionResult<T>替代,现在先不用管,能用就行。

现在启动项目,会跳出Swagger UI:

image-20240725132604898

可以在上面调试写的接口,试试刚刚创建的Get请求:

image-20240725132824604

我们刚刚写的

 _logger.LogInformation($"执行Praise请求 时间:{DateTime.Now}");

在调用接口的时候,就可以看到信息输出在控制台上了,如下所示:

image-20240725133048007

到时候为了让我们能够通过局域网访问,在Program中添加:

image-20240725133156224

到时候前端访问还需要解决一下跨域的问题,在Program中添加:

image-20240725133235285

即可。

到这里为止,我们就已经使用.NET 8 Web Api构建了一个简单的只有一个Get请求的后端服务了。

下期分享Vue与Avalonia中的部分。

From:https://www.cnblogs.com/mingupupu/p/18322881
本文地址: http://www.shuzixingkong.net/article/416
0评论
提交 加载更多评论
其他文章 Java编程指南:高级技巧解析 - Excel单元格样式的编程设置
最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 在Java开发中,处理Excel文件是一项常见的任务。在处理Excel文件时,经常需要对单元格进行样式设置,以满足特定的需求和美化要求,通过使用Java中的相关库和API,我们可以轻松地操
Java编程指南:高级技巧解析 - Excel单元格样式的编程设置 Java编程指南:高级技巧解析 - Excel单元格样式的编程设置 Java编程指南:高级技巧解析 - Excel单元格样式的编程设置
交叉熵、KL 散度 | 定义与相互关系
1 KL 散度 对于离散概率分布 \(P\) 和 \(Q\) ,KL 散度定义为: \[\text{KL}(P \| Q) = -E_{x\sim P}\log P(x)-\log Q(x) \\ =\sum_{\mathbf{x}} P(\mathbf{x}) \log \frac{P(\math
硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计
前言 电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来。 本篇描述设计常用的12V转5V电路3A。 TPS54331(DC-DC稳压器) 概述 TPS54331器件是一款28V、3A非同步降压转换器,集成有一个低 RDS(on) 的高侧MOSFET。为了提高
硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计 硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计 硬件开发笔记(二十八):TPS54331电源设计(一):5V电源供电原理图设计
给园子的会员送送优惠,和你的数据库聊聊天:会员权益「Chat2DB 特惠」上线
目前会员权益很少,而我们的开发人手极其有限,为了增加更多会员权益,我们想到一个暂时的偷懒方法,尝试找优秀的厂商合作,给园子的会员特别的优惠。幸运的是因为求救信偶遇一家有意向的AI厂商,而且公司就在杭州,而且产品与园子的用户群很匹配,于是很快地达成了合作
给园子的会员送送优惠,和你的数据库聊聊天:会员权益「Chat2DB 特惠」上线 给园子的会员送送优惠,和你的数据库聊聊天:会员权益「Chat2DB 特惠」上线
开源照片管理神器 PhotoPrism 安装和使用教程
如今我们每个人都积累了海量的照片和视频,做自媒体的 UP 主们积累的照片和视频数量可能更多。面对这么多的照片和视频,我们该如何管理呢? 之前我一直用谷歌相册,因为它有很多优势,比如无限空间,支持智能整理 (按时间线、地理位置、还支持人脸自动合并)。但去年 Google 开始对空间进行了限制,不再提供
开源照片管理神器 PhotoPrism 安装和使用教程 开源照片管理神器 PhotoPrism 安装和使用教程 开源照片管理神器 PhotoPrism 安装和使用教程
【最新最热】几何朗兰兹猜想终获破解!跨越30年研究,800余页证明论文问世,中国学者陈麟卓越贡献!
历经三十余载的潜心研究,九位杰出的数学家携手跨越了学术的崇山峻岭,通过五篇累计超过八百页的深邃论文,终于迎来了数学史上的一大盛事——几何朗兰兹猜想的壮丽证明! 这一里程碑式的成就,正是朗兰兹纲领几何化版本的璀璨绽放。朗兰兹纲领,作为现代数学研究的璀璨明珠,被誉为“数学的大统一理论”,它深刻地揭示了数
【最新最热】几何朗兰兹猜想终获破解!跨越30年研究,800余页证明论文问世,中国学者陈麟卓越贡献! 【最新最热】几何朗兰兹猜想终获破解!跨越30年研究,800余页证明论文问世,中国学者陈麟卓越贡献! 【最新最热】几何朗兰兹猜想终获破解!跨越30年研究,800余页证明论文问世,中国学者陈麟卓越贡献!
Nuxt.js 环境变量配置与使用
title: Nuxt.js 环境变量配置与使用 date: 2024/7/25 updated: 2024/7/25 author: cmdragon excerpt: 摘要:“该文探讨了Nuxt.js框架下环境变量配置的详细过程,涉及.env文件配置、运行时访问、安全性考量、在不同场景下的实践(
Nuxt.js 环境变量配置与使用 Nuxt.js 环境变量配置与使用
Cython与C函数的结合
这篇文章介绍了Python-Cython-C三种语言的简单耦合,以Cython为中间接口,实现Python数据传到C语言的后端执行相关计算。这就相当于可以在Python中调用C语言中的指针功能来进行跨维度的数组运算,至于性能依然存在优化空间,这里仅仅做一个简单的功能演示。