参考文章
- WebApi和WebService的区别_webservice接口和api接口的区别-CSDN博客: link.
- C# WebAPI学习-CSDN博客: link.
- 调用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调用程序
-
新建aps.net core web api 项目,命名为WebAPIDemo
-
删除项目自动生成的WeatherForecastController.cs和WeatherForecast.cs
-
在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; }
}
}
}
- 注释掉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();
}
}
- 把WebAPIDemo.http中的weatherforecast改为TestWebAPI
@WebAPIDemo_HostAddress = http://localhost:5222
GET {{WebAPIDemo_HostAddress}}/TestWebAPI/
Accept: application/json
###
-
编译运行,弹出两个窗口
-
在浏览器https://localhost:7024/swagger/index.html调试编写好的接口
1. 单击try it out
2. 单击execute执行测试
-
新建项目WebAPIClient,测试调用WebAPI
-
界面代码
<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>
- 后台代码
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);
}
}
}
-
打开WebAPIDemo,测试WebAPIClient
-
按按钮执行测试
注意事项
- 接口函数不能同名,否则会报错。