最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?6開發(fā)TodoList應(yīng)用之實現(xiàn)DELETE請求與HTTP請求冪等性

 更新時間:2021年12月29日 17:05:32   作者:CODE4NOTHING  
這篇文章主要介紹了在.NET6開發(fā)中如何實現(xiàn)DELETE請求以及HTTP請求冪等性的,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

需求

先說明一下關(guān)于原本想要去更新的PATCH請求的文章,從目前試驗的情況來看,如果是按照.NET 6的項目結(jié)構(gòu)(即只使用一個Program.cs完成程序初始化),那微軟官方給出的文檔目前還沒有對應(yīng)地更新,按照之前的方式進(jìn)行JsonPatch的配置是不行的,目前已經(jīng)有人在Github微軟的官方文檔Repo下提了ISSUE: .NET 6: JsonPatch in ASP.NET Core web API。并且因為PATCH的使用頻率并不高,所以我暫時跳過那篇,先把進(jìn)度繼續(xù)往后走,看微軟什么時候把這個issue解決一下我再看情況把PATCH那一節(jié)補上。

本文我們來看最后一個常用HTTP請求類型:DELETE。

目標(biāo)

實現(xiàn)并驗證應(yīng)用正確處理DELETE請求。并對HTTP請求的冪等性做簡單的介紹。

原理與思路

經(jīng)過關(guān)于Create、Update、Get的實現(xiàn),對于Delete的實現(xiàn)我們的思路是很清晰的。我們需要創(chuàng)建Delete的Command及其Handler,然后在Controller中通過Mediatr發(fā)送請求即可。

實現(xiàn)

在Application/TodoList下新建DeleteTodoList文件夾,并新建DeleteTodoListCommand:

DeleteTodoListCommand.cs

using MediatR;
using TodoList.Application.Common.Exceptions;
using TodoList.Application.Common.Interfaces;

namespace TodoList.Application.TodoLists.Commands.DeleteTodoList;

public class DeleteTodoListCommand : IRequest
{
    public Guid Id { get; set; }
}

public class DeleteTodoListCommandHandler : IRequestHandler<DeleteTodoListCommand>
{
    private readonly IRepository<Domain.Entities.TodoList> _repository;

    public DeleteTodoListCommandHandler(IRepository<Domain.Entities.TodoList> repository)
    {
        _repository = repository;
    }

    public async Task<Unit> Handle(DeleteTodoListCommand request, CancellationToken cancellationToken)
    {
        var entity = await _repository.GetAsync(request.Id);
        if (entity == null)
        {
            throw new NotFoundException(nameof(TodoList), request.Id);
        }

        await _repository.DeleteAsync(entity,cancellationToken);
        // 對于Delete操作,演示中并不返回任何實際的對象,可以結(jié)合實際需要返回特定的對象。Unit對象在MediatR中表示Void
        return Unit.Value;
    }
}

在Controller中添加Delete的接口處理:

TodoListController.cs

// 省略其他...
[HttpDelete("{id:guid}")]
public async Task<ApiResponse<object>> Delete(Guid id)
{
    return ApiResponse<object>.Success(await _mediator.Send(new DeleteTodoListCommand { Id = id }));
}

這里可能值得強調(diào)的是關(guān)于EntityFrameworkCore中對于關(guān)聯(lián)實體DELETE操作的處理方式:

打開Infrastructure/Migrations文件夾,我們可以在遷移領(lǐng)域?qū)嶓w的那次Migration生成的.Designer.cs文件中發(fā)現(xiàn)這樣一段配置:

// 省略其他...
modelBuilder.Entity("TodoList.Domain.Entities.TodoItem", b =>
    {
        b.HasOne("TodoList.Domain.Entities.TodoList", "List")
            .WithMany("Items")
            .HasForeignKey("ListId")
            .OnDelete(DeleteBehavior.Cascade)
            .IsRequired();
        b.Navigation("List");
    });

可以看到在OnDelete中配置的是DeleteBehavior.Cascade行為模式,關(guān)于DeleteBehavior,可以參考Referential Constraint Action Options。實際上總共有七種可以設(shè)置的行為模式:

  • DeleteBehavior.Cascade
  • DeleteBehavior.NoAction
  • DeleteBehavior.Restrict
  • DeleteBehavior.SetNull
  • DeleteBehavior.ClientCascade
  • DeleteBehavior.ClientNoAction
  • DeleteBehavior.ClientSetNull

關(guān)于這七種DeleteBehavior,可以參考這篇博文:Entity Framework Core 關(guān)聯(lián)刪除,博主在其中進(jìn)行了比較詳細(xì)的實驗和總結(jié)。

可以根據(jù)實際需要去顯式地配置DeleteBehavior。另外,習(xí)慣觀察生成的Migrations文件,也是學(xué)習(xí)EFCore一些慣例或者說默認(rèn)配置的很好的方法。

驗證

啟動Api項目,發(fā)送DELETE請求:

請求

響應(yīng)

并且從數(shù)據(jù)庫里我們以可以發(fā)現(xiàn),這條TodoList下包含的TodoItem也被一同刪除了。

總結(jié)

到此為止HTTP常用的四大請求我們已經(jīng)通過幾個例子講完了,關(guān)于HEAD請求OPTION請求以及遺留的PATCH請求后面會寫完。下一篇文章開始我們一起學(xué)習(xí)如何使用FluentValidation來進(jìn)行請求參數(shù)校驗。

關(guān)于HTTP請求冪等性的介紹

首先明確兩個概念:

1.什么叫做HTTP請求是否安全:如果我們執(zhí)行請求后,對應(yīng)的資源實體不發(fā)生改變,我們稱這個請求是安全的;

2.什么叫做HTTP請求是否冪等:對于執(zhí)行請求后產(chǎn)生的副作用(即指如果請求不安全,則稱其會產(chǎn)生副作用),請求執(zhí)行一次和執(zhí)行多次的副作用是相同的,我們稱這個請求是冪等的,很顯然安全的請求一定是冪等的。

了解了這兩個概念后,我們直接來看這張表格,快速地對HTTP請求的安全性和冪等性有一個認(rèn)識。

鑒于PATCH方法并不常用,那么重點需要關(guān)注的主要就是POST請求,以及一部分的PUT請求(比如更新的字段是在當(dāng)前字段值的基礎(chǔ)上進(jìn)行計算而新得出這種場景,實際就不是冪等的,但是我們一般不推薦在Update時做這種類型的操作,更推薦的是把計算邏輯前置到接口響應(yīng)處理前,以整體設(shè)置值的方式去Update實體)。一般而言POST請求是用來創(chuàng)建資源的,如果不采取某種方式來保證執(zhí)行結(jié)果的實際冪等性,那么該請求產(chǎn)生的副作用將是難以控制和處理的。

如何保證接口的冪等性?

正式因為并非所有的HTTP請求(在這里我們可以泛化到任意類型的接口請求)都是冪等的,而不管是應(yīng)用程序內(nèi)的容錯還是服務(wù)之間因為分區(qū)導(dǎo)致的對請求的冪等性更為嚴(yán)格的要求(尤其是在分布式系統(tǒng)中,對于分區(qū)導(dǎo)致的請求重試的場景),我們需要在設(shè)計和實現(xiàn)接口的時候,把冪等性設(shè)計考慮進(jìn)來,提高接口的魯棒性。

總體來說,實現(xiàn)接口的冪等性有兩種思路:一種是通過代碼邏輯去限制重復(fù)調(diào)用出現(xiàn)的副作用;第二種是通過Token唯一性來保證同一個請求不會被調(diào)用多次。

通過代碼邏輯去限制副作用的實現(xiàn)方式有很多種:從前端/界面的層次上去人為限制請求的重復(fù)發(fā)送(比如按鈕置灰禁止點擊之類的),通過在數(shù)據(jù)庫層面應(yīng)用鎖或使用唯一索引,通過在邏輯執(zhí)行過程中應(yīng)用鎖等方式。這種方式只能針對一些通過滿足某些判斷進(jìn)行的邏輯實現(xiàn),有其局限性。

通過Token唯一性保證冪等的思路大致是這樣:生成全局唯一的Token保存下來,并在前端頁面獲取保存,發(fā)送請求時連同Token一起發(fā)到后端,后端先進(jìn)行Token校驗,校驗通過發(fā)送實際請求或執(zhí)行邏輯,完成后刪除舊Token并生成新Token,那么前端下次攜帶保存的舊Token來請求時,因為Token校驗不通過而拒絕繼續(xù)執(zhí)行。這種方式就好比短信驗證碼,只有第一次攜帶這個驗證碼請求時會成功,后端判斷第一次請求有效后就會把這個驗證碼置為無效,下次你就無法攜帶相同的驗證碼繼續(xù)發(fā)起請求了。例子不是特別恰當(dāng),但是可以類比著進(jìn)行理解。?

到此這篇關(guān)于.NET 6開發(fā)TodoList應(yīng)用之實現(xiàn)DELETE請求與HTTP請求冪等性的文章就介紹到這了,更多相關(guān).NET 6實現(xiàn)DELETE請求與HTTP請求冪等性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .net core靜態(tài)中間件的使用

    .net core靜態(tài)中間件的使用

    本文主要整理了靜態(tài)中間件的使用,學(xué)習(xí).net core的朋友可以參考下本文
    2021-06-06
  • asp.net Oracle數(shù)據(jù)庫訪問操作類

    asp.net Oracle數(shù)據(jù)庫訪問操作類

    asp.net Oracle數(shù)據(jù)庫訪問操作類,需要的朋友可以參考一下
    2013-03-03
  • c# .Net Core靜態(tài)文件服務(wù)器的新人入門教程

    c# .Net Core靜態(tài)文件服務(wù)器的新人入門教程

    這篇文章主要給大家介紹了關(guān)于c# .Net Core靜態(tài)文件服務(wù)器的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • ASP.net Forms驗證Demo

    ASP.net Forms驗證Demo

    Asp.net中基于Forms驗證的角色驗證授權(quán)
    2009-01-01
  • vs2010出現(xiàn)error MSB8008的解決方法

    vs2010出現(xiàn)error MSB8008的解決方法

    這篇文章主要為大家詳細(xì)介紹了vs2010問題error MSB8008: 指定的平臺工具集(v110)未安裝或無效的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • WPF框架Prism中區(qū)域Region用法介紹

    WPF框架Prism中區(qū)域Region用法介紹

    這篇文章介紹了WPF框架Prism中區(qū)域Region用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • C#保存上傳來的圖片示例代碼

    C#保存上傳來的圖片示例代碼

    保存上傳圖片的方法有很多,在接下來的文章中為大家詳細(xì)介紹下使用C#是如何做到的,感興趣的朋友不要錯過
    2013-11-11
  • 使用PowerShell .Net獲取電腦中的UUID

    使用PowerShell .Net獲取電腦中的UUID

    這篇文章主要介紹了使用PowerShell .Net獲取電腦中的UUID 的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • asp.NET開發(fā)中正則表達(dá)式中BUG分析

    asp.NET開發(fā)中正則表達(dá)式中BUG分析

    又發(fā)現(xiàn)了一個 .net的bug!最近在使用正則表達(dá)式的時候發(fā)現(xiàn):在忽略大小寫的時候,匹配值從 0xff 到 0xffff 之間的所有字符,正則表達(dá)式竟然也能匹配兩個 ASCII 字符:i(code: 0x69) 和 I(code: 0x49);但是仍然不能匹配其他的 ASCII 字母和數(shù)字。
    2008-10-10
  • .NET 水晶報表使用代碼

    .NET 水晶報表使用代碼

    下面就是介紹在.net下,如何使用水晶報表的方法。
    2009-04-04

最新評論

黎川县| 乌兰察布市| 商城县| 思茅市| 滦平县| 平罗县| 宣汉县| 临江市| 文山县| 万山特区| 大悟县| 句容市| 攀枝花市| 马鞍山市| 错那县| 五原县| 镇平县| 潼南县| 穆棱市| 正阳县| 贵阳市| 台江县| 奎屯市| 通道| 睢宁县| 名山县| 汕头市| 潼关县| 桦川县| 盐山县| 寿宁县| 苍山县| 长兴县| 讷河市| 双城市| 灵武市| 化州市| 启东市| 海淀区| 甘孜| 中山市|