設(shè)計(jì)強(qiáng)大的 API 的一個(gè)關(guān)鍵方面是能夠以各種格式返回響應(yīng),以滿足不同的客戶端需求。在 API 的上下文中,序列化和反序列化對(duì)于客戶端和服務(wù)器之間的數(shù)據(jù)交換至關(guān)重要。當(dāng)客戶端向 API 發(fā)出請(qǐng)求時(shí),它通常需要向服務(wù)器發(fā)送數(shù)據(jù)(例如 JSON)。服務(wù)器將此數(shù)據(jù)反序列化為它可以處理的對(duì)象。當(dāng)服務(wù)器響應(yīng)時(shí),它會(huì)將對(duì)象序列化回客戶端可以理解的格式(例如,JSON、XML)。

序列化是將對(duì)象轉(zhuǎn)換為易于存儲(chǔ)或傳輸?shù)母袷降倪^程。這可能涉及將對(duì)象轉(zhuǎn)換為字節(jié)流、JSON 字符串、XML 文檔或其他格式。序列化可以將對(duì)象的狀態(tài)保存到文件中,通過網(wǎng)絡(luò)發(fā)送對(duì)象,或?qū)⑵浯鎯?chǔ)在數(shù)據(jù)庫(kù)中。

反序列化是相反的過程。它涉及將數(shù)據(jù)從存儲(chǔ)或傳輸?shù)母袷睫D(zhuǎn)換回對(duì)象。這允許使用其原始狀態(tài)和數(shù)據(jù)重建對(duì)象。

API 可以根據(jù)需求和客戶端的偏好返回各種類型的數(shù)據(jù)格式。以下是 API 可以返回的一些常見數(shù)據(jù)類型:

HTTP本身并不規(guī)定數(shù)據(jù)如何在格式上在客戶端和服務(wù)器之間傳遞;它與所使用的內(nèi)容類型和編碼無(wú)關(guān)。JSON 是一種被廣泛接受的現(xiàn)代 Web API 數(shù)據(jù)交換格式,因?yàn)樗哂泻?jiǎn)單性、可讀性以及與 JavaScript 和許多其他編程語(yǔ)言的易用性。

以下是 HTTP 請(qǐng)求和響應(yīng)中通常如何處理 JSON 數(shù)據(jù):

HTTP 請(qǐng)求:

HTTP 響應(yīng):

編碼問題:

在 .NET 中,在中間件中配置序列化涉及設(shè)置適當(dāng)?shù)男蛄谢绦蚝透袷交绦騺?lái)處理各種數(shù)據(jù)格式。以下是在 .NET 6 中執(zhí)行此操作的方法。

在 .NET 中間件中配置序列化的分步指南

使用 System.Text.Json 進(jìn)行1. JSON序列化

System.Text.Json是 .NET Core 和 .NET 6 中的默認(rèn) JSON 序列化程序。它以其性能和低內(nèi)存使用率而聞名。

2. JSON 使用 Newtonsoft.Json 進(jìn)行序列化

Newtonsoft.Json(也稱為 Json.NET)是用于 .NET 的常用 JSON 框架。它具有高度的通用性,并因其廣泛的功能而被廣泛使用。我們需要添加 nuget 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson,并在 .net 中間件中配置它,如下所示

var builder = WebApplication.CreateBuilder(args);  

builder.Services.AddControllers()
.AddNewtonsoftJson();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

3. XML序列化

對(duì)于 XML 序列化,您需要將 XML 格式化程序添加到 API 配置中。我們需要 dotnet 添加 nuget 包和配置 Microsoft.AspNetCore.Mvc.Formatters.Xml

var builder = WebApplication.CreateBuilder(args);  

// Add services to the container.
builder.Services.AddControllers()
.AddXmlSerializerFormatters(); // Add XML support

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

4. 協(xié)議緩沖區(qū) (Protobuf)

協(xié)議緩沖區(qū)用于高效的數(shù)據(jù)序列化,適用于性能關(guān)鍵型應(yīng)用程序。我們需要添加包 Google.Protobuf 和 Grpc.AspNetCore 以及處理請(qǐng)求和響應(yīng)的控制器,并將其配置為支持 JSON 和 XML 序列化。

var builder = WebApplication.CreateBuilder(args);  
builder.Services.AddGrpc();
builder.Services.AddControllers();

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();

在 .NET 6 中,可以將中間件配置為支持多種序列化格式,例如 XML 和 JSON。讓我們看看下面的代碼,以同時(shí)使用 XML 序列化和 Newtonsoft.Json 序列化。

var builder = WebApplication.CreateBuilder(args);  

builder.Services.AddControllers()
.AddNewtonsoftJson() // Add Newtonsoft.Json support
.AddXmlSerializerFormatters(); // Add XML support

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
[ApiController]
[Route("api/[controller]")]
public class OrderController : ControllerBase
{
[HttpPost]
[Produces("application/json", "application/xml")]
public IActionResult CreateOrder()
{
var contentType = Request.ContentType;

if (contentType.Contains("application/json"))
{
using var reader = new StreamReader(Request.Body);
var jsonString = reader.ReadToEnd();
var order = JsonConvert.DeserializeObject<Order>(jsonString);

if (order == null)
{
return BadRequest();
}

return Ok(order); // Return the created order in JSON
}
else if (contentType.Contains("application/xml"))
{
var serializer = new XmlSerializer(typeof(Order));
using var reader = new StreamReader(Request.Body);
var order = (Order)serializer.Deserialize(reader);
if (order == null)
{
return BadRequest();
}
return Ok(order); // Return the created order in XML
}
else
{
return UnsupportedMediaType();
}
}
}

結(jié)論

在 .NET 中間件中配置序列化涉及選擇適當(dāng)?shù)男蛄谢绦虿⒃O(shè)置必要的格式化程序。通過理解和利用 System.Text.Json、Newtonsoft.Json、XML 格式化程序和協(xié)議緩沖區(qū)等庫(kù),您可以確保您的 API 有效地處理各種數(shù)據(jù)格式,滿足不同的客戶端需求并優(yōu)化性能。這些配置和庫(kù)使開發(fā)人員能夠創(chuàng)建多功能且強(qiáng)大的 API,這些 API 可以有效地序列化和反序列化數(shù)據(jù),從而增強(qiáng)互操作性和性能。

本文章轉(zhuǎn)載微信公眾號(hào)@dotNET跨平臺(tái)

上一篇:

使用ASP.NET Core 3.x 構(gòu)建 RESTful API

下一篇:

在.NET Core中集成SignalR實(shí)現(xiàn)實(shí)時(shí)通知的API應(yīng)用
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊(cè)

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場(chǎng)景實(shí)測(cè),選對(duì)API

#AI文本生成大模型API

對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對(duì)比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對(duì)比試用API 限時(shí)免費(fèi)