C# WebAPI学习

参考文章

  1. WebApi和WebService的区别_webservice接口和api接口的区别-CSDN博客: link.
  2. C# WebAPI学习-CSDN博客: link.
  3. 调用WebApi的7种方式-CSDN博客: link.

WebAPI概述

WebApi是微软在VS2012 MVC4版本中绑定发行的,WebApi是完全基于Restful标准的框架。RestFul: (英文:Representational State Transfer,简称REST)网上关于Restful定义的资料很多,我个人理解的Restful api 是指基于资源的定义的接口,它的所有接口都是对资源的操作。REST的核心原则是将你的API拆分为逻辑上的资源。这些资源通过http被操作(GET ,POST,PUT,DELETE).Restful Api接口标准的定义满足CURD,标准的接口定义如下:
1.GET
获取资源,例如查询数据,安全。
2.POST
创建资源,例如插入数据,不安全。
3.PUT
更新特定资源,例如更新数据,不安全。
4.DELETE
删除特定资源,例如删除数据,不安全。
5.PATCH
对资源进行部分更新,例如更新数据,不安全
6.HEAD
查询返回文件的头部信息,安全。
7.OPTIONS
获取指定资源所支持的操作,安全。

WebAPI和webservice的区别

Web API和Web Service是两种常见的实现Web服务的技术,它们有以下几点区别:
技术标准:
Web API是基于HTTP协议和RESTful架构设计的,使用JSON或XML作为数据交换格式。而Web Service则是使用SOAP协议和WSDL(Web Services Description Language)描述服务接口。使用的XML作为数据交换格式

架构风格:
Web API采用了RESTful架构风格,强调资源的状态转换和无状态性。而Web Service则基于面向服务的架构(SOA),加强了服务之间的松耦合。

通信协议:
Web API主要使用HTTP协议作为通信协议,通过GET、POST、PUT、DELETE等HTTP方法进行交互。而Web Service则使用SOAP协议,该协议支持多种传输协议如HTTP、SMTP等。

数据交换格式:
Web API一般使用JSON或XML作为数据交换格式,这两种格式易于解析和处理。而Web Service使用SOAP消息格式,其结构相对复杂。

跨平台兼容性:
由于Web API采用标准的HTTP协议和RESTful架构,因此较容易在不同的平台和编程语言中进行集成和调用。而Web Service则需要通过SOAP协议和WSDL描述文件进行交互,有一定的跨平台兼容性问题。

总结:
Web API更加轻量级、灵活和易于使用,适用于构建现代化的Web服务。而Web Service则更倾向于复杂的企业级应用,适用于构建大型和复杂的服务导向架构。选择使用哪种技术需根据具体的需求和场景来决定。

编写简单的WebAPI程序和WebAPI调用程序

  1. 新建aps.net core web api 项目,命名为WebAPIDemo
    ​​在这里插入图片描述

  2. 删除项目自动生成的WeatherForecastController.cs和WeatherForecast.cs
    在这里插入图片描述
    在这里插入图片描述

  3. 在Controllers下新建TestWebAPI类和Param类。代码如下:

using Microsoft.AspNetCore.Mvc;

namespace WebAPIDemo.Controllers
{
    /// <summary>
    /// TestWebAPI
    /// </summary>
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class TestWebAPI
    {
        /// <summary>
        /// get
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult<string> Get()
        {
            return "Hello World";
        }

        /// <summary>
        /// Add
        /// </summary>
        /// <param name="num1"></param>
        /// <param name="num2"></param>
        /// <returns></returns>
        [HttpGet]
        public ActionResult<int> Add(int num1, int num2)
        {
            return num1 + num2;
        }

        /// <summary>
        /// get2
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult<int> SubTract(Param param)
        {
            return param.num1 - param.num2;
        }

        /// <summary>
        /// param class
        /// </summary>
        public class Param
        {
            /// <summary>
            /// num1
            /// </summary>
            public int num1 { get; set; }
            /// <summary>
            /// num2
            /// </summary>
            public int num2 { get; set; }
        }
    }
}

  1. 注释掉Program中的app.UseHttpsRedirection();
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            //app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
  1. 把WebAPIDemo.http中的weatherforecast改为TestWebAPI
@WebAPIDemo_HostAddress = http://localhost:5222

GET {{WebAPIDemo_HostAddress}}/TestWebAPI/
Accept: application/json

###

  1. 编译运行,弹出两个窗口
    在这里插入图片描述
    在这里插入图片描述

  2. 在浏览器https://localhost:7024/swagger/index.html调试编写好的接口
    1. 单击try it out在这里插入图片描述
    2. 单击execute执行测试
    在这里插入图片描述

  3. 新建项目WebAPIClient,测试调用WebAPI

  4. 界面代码

<Window x:Class="WebAPIClient.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WebAPIClient"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <TextBox Grid.Row="1" Grid.Column="0" x:Name="txtNum1" Margin="20"  Text="1" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBox>
        <TextBox Grid.Row="1" Grid.Column="1" x:Name="txtNum2" Margin="20"  Text="2"  VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBox>
        <TextBox Grid.Row="2" Grid.Column="0" x:Name="txtNum3" Margin="20"  Text="1" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBox>
        <TextBox Grid.Row="2" Grid.Column="1" x:Name="txtNum4" Margin="20"  Text="2" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBox>

        <Button Grid.Row="0" Grid.Column="2" Content="Get" x:Name="btnGet" Margin="20" Click="btnGet_Click"></Button>
        <Button Grid.Row="1" Grid.Column="2" Content="Add" x:Name="btnGet1" Margin="20" Click="btnAdd_Click"></Button>
        <Button Grid.Row="2" Grid.Column="2" Content="SubTract" x:Name="btnSubTract" Margin="20" Click="btnSubTract_Click"></Button>

        <TextBlock Grid.Row="0" Grid.Column="3" x:Name="txtGet" Margin="20"  VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBlock>
        <TextBlock Grid.Row="1" Grid.Column="3" x:Name="txtGet1" Margin="20"  VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBlock>
        <TextBlock Grid.Row="2" Grid.Column="3" x:Name="txtSubTract" Margin="20"  VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"></TextBlock>
    </Grid>
</Window>

  1. 后台代码
using System.IO;
using System.Net.Security;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WebAPIClient
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btnGet_Click(object sender, RoutedEventArgs e)
        {
           
            txtGet.Text = HttpGet("http://localhost:5000/api/TestWebAPI/Get");
        }

        private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            //https://localhost:7024/api/TestWebAPI/Add?num1=1&num2=2
            StringBuilder sb = new StringBuilder();
            sb.Append("http://localhost:5000/api/TestWebAPI/Add?num1=");
            sb.Append(txtNum1.Text.Trim());
            sb.Append("&num2=");
            sb.Append(txtNum2.Text.Trim());
            txtGet1.Text = HttpGet(sb.ToString());
        }

        private void btnSubTract_Click(object sender, RoutedEventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("{\"num1\":");
            sb.Append(txtNum3.Text.Trim());
            sb.Append(",\"num2\":");
            sb.Append(txtNum4.Text.Trim());
            sb.Append("}");
            txtSubTract.Text = HttpPost("http://localhost:5000/api/TestWebAPI/SubTract", sb.ToString());
        }

        public static bool CheckValidationResult(object sender, X509Certificate certificate,
           X509Chain chain, SslPolicyErrors errors)
        {
            return true;
        }

        public static string HttpPost(string url, string body)
        {
            //ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            Encoding encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.Accept = "text/html, application/xhtml+xml, */*";
            request.ContentType = "application/json";

            byte[] buffer = encoding.GetBytes(body);
            request.ContentLength = buffer.Length;
            request.GetRequestStream().Write(buffer, 0, buffer.Length);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }

        public static string HttpGet(string url)
        {
            //ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            Encoding encoding = Encoding.UTF8;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.Accept = "text/html,application/xhtml+xml,*/*";
            request.ContentType = "application/json";

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
        }
    }
}
  1. 打开WebAPIDemo,测试WebAPIClient
    在这里插入图片描述

  2. 按按钮执行测试
    在这里插入图片描述

注意事项

  1. 接口函数不能同名,否则会报错。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值