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

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

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

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

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

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

Vue:

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

开始使用.NET 8 Web Api

选择Web Api模板:

其他信息:

这里有几点可以注意:

配置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:

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

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

安装SemanticKernel:

在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给我们回复。

现在项目结构如下所示:

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

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

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

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

[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:

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

我们刚刚写的

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

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

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

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

即可。

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

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

合集: C# , ASP.NET Core Web Api

目录
相关文章
|
8天前
|
前端开发
【前端web入门第四天】02 CSS三大特性+背景图
本文详细介绍了CSS的三大特性:继承性、层叠性和优先级,并深入讲解了背景图的相关属性,包括背景属性、背景图的平铺方式、位置设定、缩放、固定以及复合属性。其中,继承性指子元素自动继承父元素的文字控制属性;层叠性指相同属性后定义覆盖前定义,不同属性可叠加;优先级涉及选择器权重,包括行内样式、ID选择器等。背景图部分则通过具体示例展示了如何设置背景图像的位置、大小及固定方式等。
235 91
|
8天前
|
前端开发
【前端web入门第四天】01 复合选择器与伪类选择器
本文档详细介绍了CSS中的复合选择器与伪类选择器。复合选择器包括后代选择器、子代选择器、并集选择器和交集选择器,能够更精确地定位和样式化元素。后代选择器用于选中某元素的所有后代,子代选择器仅选中直接子元素。并集选择器可为多个标签设置相同样式,而交集选择器则选中同时满足多个条件的元素。此外,还介绍了伪类选择器,如鼠标悬停效果和超链接的不同状态。
45 32
【前端web入门第四天】01 复合选择器与伪类选择器
|
7天前
|
前端开发
【前端web入门第五天】03 清除默认样式与外边距问题【附综合案例产品卡片与新闻列表】
本文档详细介绍了CSS中清除默认样式的方法,包括清除内外边距、列表项目符号等;探讨了外边距的合并与塌陷问题及其解决策略;讲解了行内元素垂直边距的处理技巧;并介绍了圆角与盒子阴影效果的实现方法。最后通过产品卡片和新闻列表两个综合案例,展示了所学知识的实际应用。
22 11
|
7天前
|
前端开发
|
7天前
|
弹性计算 前端开发 容器
【前端web入门第六天】02 flex布局
Flex布局是一种现代CSS布局模式,通过给父元素设置`display: flex`,其子元素可自动挤压或拉伸。它包含弹性容器和弹性盒子,主轴默认为水平方向,侧轴为垂直方向。主轴对齐方式由`justify-content`属性控制,侧轴对齐方式包括`align-items`(针对所有子元素)和`align-self`(针对单个子元素)。修改主轴方向使用`flex-direction`属性,`flex`属性用于控制子元素在主轴上的伸缩比例。此外,`flex-wrap`属性允许子元素换行,而`align-content`属性则定义多行对齐方式。
|
7天前
|
前端开发
【前端web入门第五天】01 结构伪类选择器与伪元素选择器
本文介绍了CSS中的结构伪类选择器和伪元素选择器。结构伪类选择器如`nth-child`可根据元素结构关系进行选择,例如将列表中首个`&lt;li&gt;`元素背景设为绿色。伪元素选择器用于创建装饰性内容。
|
6天前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
27 6
|
7天前
|
前端开发
【前端web入门第五天】02 盒子模型基础
本文档详细介绍了CSS中的盒子模型及其组成部分,包括内容区域、内边距、边框线和外边距。通过具体示例展示了如何设置边框线、内边距及外边距,并解释了尺寸计算方法和版心居中的技巧。内容丰富,示例清晰,有助于理解盒子模型在网页布局中的应用。
|
7天前
|
前端开发
【前端web入门第六天】01 CSS浮动
这是关于CSS布局第六天学习目标的介绍,主要解决多个`&lt;div&gt;`标签在同一行显示的问题,即一个在左边,另一个在右边。文中介绍了标准流、浮动及flex布局的概念,重点推荐使用flex布局。文章详细讲解了浮动的基本使用、布局技巧及清除浮动的方法,包括额外标签法、单伪元素法、双伪元素法和`overflow`隐藏法,并提供了示例代码帮助理解。
|
7天前
|
前端开发
前端web入门第四天】03 显示模式+综合案例热词与banner效果
本文档介绍了HTML中标签的三种显示模式:块级元素、行内元素与行内块元素,并详细解释了各自的特性和应用场景。块级元素独占一行,宽度默认为父级100%,可设置宽高;行内元素在同一行显示,尺寸由内容决定,设置宽高无效;行内块元素在同一行显示,尺寸由内容决定,可设置宽高。此外,还提供了两个综合案例,包括热词展示和banner效果实现,帮助读者更好地理解和应用这些显示模式。