国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - ASP.NET教程 - ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用

ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用

2021-12-13 18:10xfrog ASP.NET教程

這篇文章主要介紹了ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用方法,幫助大家更好的理解和學(xué)習(xí)使用.net技術(shù),感興趣的朋友可以了解下

    如今,完全獨(dú)立的業(yè)務(wù)應(yīng)用幾乎不存在,不管是在企業(yè)內(nèi)部微服務(wù)之間的調(diào)用,還是與外部第三方服務(wù)的調(diào)用,Http的API交互是常見(jiàn)的場(chǎng)景,這些實(shí)際情況給我們的開(kāi)發(fā)帶來(lái)了比較大的挑戰(zhàn),一是第三方服務(wù)可能會(huì)牽制我們的開(kāi)發(fā)進(jìn)度,特別是在多團(tuán)隊(duì)開(kāi)發(fā)的情況下,由于依賴于其他團(tuán)隊(duì)的服務(wù),有時(shí)候需要等待其他團(tuán)隊(duì)的進(jìn)度,導(dǎo)致自己團(tuán)隊(duì)的無(wú)效等待。有時(shí)因?yàn)槠渌麍F(tuán)隊(duì)的延期,導(dǎo)致團(tuán)隊(duì)的被動(dòng)延期。二是第三方服務(wù)的質(zhì)量問(wèn)題或開(kāi)發(fā)過(guò)程中的頻繁更新導(dǎo)致的部署問(wèn)題,將嚴(yán)重拖累自己團(tuán)隊(duì)的開(kāi)發(fā)進(jìn)度,同時(shí)讓你無(wú)法專心的開(kāi)發(fā)自己的服務(wù)。三是單元測(cè)試?yán)щy,特別是在依賴于多個(gè)第三方服務(wù)時(shí),使得單元測(cè)試可能依賴于其他服務(wù)環(huán)境,導(dǎo)致單元測(cè)試結(jié)果的不確定性。

    為了解決以上這些問(wèn)題,Xfrogcn.AspNetCore.Extensions擴(kuò)展庫(kù)提供了Http請(qǐng)求模擬的功能,通過(guò)此功能可以讓你在開(kāi)發(fā)、單元測(cè)試時(shí)實(shí)現(xiàn)你的服務(wù)與第三方服務(wù)的完全解耦,讓你能夠更聚焦于自己服務(wù)的開(kāi)發(fā)。

    Http請(qǐng)求模擬構(gòu)建在.NET Core HttpClientFactory架構(gòu)之上,通過(guò)在HttpClient請(qǐng)求管道中替換實(shí)際發(fā)送Http請(qǐng)求的主消息處理器為模擬消息處理器來(lái)完成請(qǐng)求的模擬應(yīng)答。

一、在服務(wù)端使用

    假設(shè)我們負(fù)責(zé)開(kāi)發(fā)一個(gè)訂單服務(wù),在訂單提交接口,我們保存完訂單數(shù)據(jù)之后,需要發(fā)送消息通知,消息通知的發(fā)送由消息服務(wù)來(lái)實(shí)現(xiàn),該服務(wù)由另一團(tuán)隊(duì)負(fù)責(zé),如下圖所示:

ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用

    由于訂單服務(wù)依賴于消息服務(wù),在項(xiàng)目啟動(dòng)時(shí),一般兩個(gè)團(tuán)隊(duì)會(huì)協(xié)商好消息服務(wù)的接口定義,然后消息服務(wù)團(tuán)隊(duì)會(huì)快速搭建一個(gè)空接口供訂單服務(wù)團(tuán)隊(duì)調(diào)用,如果是這種流程,訂單服務(wù)團(tuán)隊(duì)只需等待消息服務(wù)團(tuán)隊(duì)搭建好環(huán)境即可開(kāi)始工作,好像影響不大,但在實(shí)際開(kāi)發(fā)過(guò)程中,會(huì)存在以下現(xiàn)實(shí)的問(wèn)題:

  • 雖然消息服務(wù)團(tuán)隊(duì)提供空接口的時(shí)間不長(zhǎng),但是如果項(xiàng)目工期緊張,計(jì)劃都是以小時(shí)計(jì)算,那么這也將影響訂單服務(wù)的開(kāi)發(fā)進(jìn)度
  • “空消息服務(wù)”實(shí)際上無(wú)法一直保持空的狀態(tài),消息服務(wù)團(tuán)隊(duì)會(huì)不斷對(duì)服務(wù)進(jìn)行更新加入他們的實(shí)現(xiàn)邏輯,而消息服務(wù)本身也可能依賴于其他的服務(wù),這導(dǎo)致訂單團(tuán)隊(duì)所使用的消息服務(wù)不穩(wěn)定,那么訂單團(tuán)隊(duì)的進(jìn)度實(shí)際上還是會(huì)受到消息服務(wù)團(tuán)隊(duì),以及消息服務(wù)所依賴的其他團(tuán)隊(duì)的影響。
  • 訂單服務(wù)團(tuán)隊(duì)可以使用空的消息服務(wù),但消息服務(wù)團(tuán)隊(duì)往往需要連接企業(yè)外部的第三方服務(wù),比如App的消息推送通道,這讓整個(gè)項(xiàng)目依賴更加復(fù)雜。
  • 訂單服務(wù)團(tuán)隊(duì)編寫(xiě)單元測(cè)試會(huì)比較困難(當(dāng)然,此點(diǎn)可以通過(guò)抽象來(lái)解決,但結(jié)合擴(kuò)展庫(kù)的Http請(qǐng)求模擬功能,我們可以簡(jiǎn)化此過(guò)程)

    以下介紹如何使用擴(kuò)展庫(kù)的請(qǐng)求模擬功能。

    為了聚焦于模擬功能的演示,該示例進(jìn)行了簡(jiǎn)化,比如與消息服務(wù)的通訊,在正式項(xiàng)目中會(huì)通過(guò)消息服務(wù)的SDK來(lái)完成,示例中將直接使用HttpClient,有關(guān)SDK與擴(kuò)展庫(kù)的結(jié)合,我們將在后續(xù)文章中說(shuō)明。

1.引用Xfrogcn.AspNetCore.Extensions
2.定義訂單類

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Order
{
    public string Id { get; set; }
 
    public string ProductCode { get; set; }
 
    public decimal Price { get; set; }
    
    public int Quantity { get; set; }
 
    public decimal Amount { get; set; }
}

3.定義消息發(fā)送請(qǐng)求類

?
1
2
3
4
5
6
7
8
public class SendMessageRequest
{
    public string MessageId { get; set; }
 
    public string Message { get; set; }
 
    public List<int> UserIds { get; set; }
}

4.配置
    在Starup ConfigureServices方法中配置模擬

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    // 啟用擴(kuò)展庫(kù)
    services.AddExtensions(Configuration);
 
    // 消息服務(wù)所使用的HttpClient名稱MESSAGESERVICE
    IHttpClientBuilder messageClient = services.AddHttpClient("MESSAGESERVICE", client =>
    {
        // 設(shè)置基礎(chǔ)地址
        client.BaseAddress = new Uri("http://api.hello.com/");
    });
    // 只有Mock配置設(shè)置為true時(shí),才啟用,通過(guò)開(kāi)發(fā)應(yīng)用配置文件來(lái)配置
    if (Configuration.GetValue<bool>("Mock"))
    {
        // 配置針對(duì)消息服務(wù)客戶端,POST到/message/send接口的請(qǐng)求,都將返回一個(gè)ResponseMessage
        messageClient.AddMockHttpMessageHandler()
            .AddMock<ResponseMessage>("/message/send", HttpMethod.Post, new ResponseMessage());
    }
 
}

    注意,以上通過(guò)配置中的Mock屬性來(lái)決定是否開(kāi)啟模擬功能,為了不影響正式發(fā)布,可以通過(guò)開(kāi)發(fā)環(huán)境配置(appsettings.Development.json)來(lái)開(kāi)啟模擬:

?
1
2
3
{
  "Mock": true
}

5.控制器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[Route("api/order")]
[ApiController]
public class OrderController : ControllerBase
{
    readonly HttpClient messageClient;
    public OrderController(IHttpClientFactory clientFactory)
    {
        // 創(chuàng)建消息服務(wù)所使用的客戶端,名稱與配置所使用的名稱一致
        // 實(shí)際項(xiàng)目中千萬(wàn)不要寫(xiě)上哦~
        messageClient = clientFactory.CreateClient("MESSAGESERVICE");
    }
 
    [HttpPost]
    public async Task<ResponseMessage> SaveOrder([FromBody]Order order)
    {
        // 保存訂單,省略了....
        // 調(diào)用消息服務(wù)接口
        ResponseMessage response = await messageClient.PostAsync<ResponseMessage>(
            "/message/send", new SendMessageRequest()
            {
                MessageId = Guid.NewGuid().ToString("N").ToLower(),
                Message = "訂單已提交",
                UserIds = new List<int>() { 1,2,3}
            });
        // 根據(jù)消息服務(wù)返回應(yīng)答繼續(xù)處理,省略了...
 
        return response;
    }
}

6.啟動(dòng),然后通過(guò)Api測(cè)試工具(如Postman)向/api/order POST請(qǐng)求,接口將返回以下應(yīng)答:

?
1
2
3
4
5
{
    "code": "0",
    "message": null,
    "isSuccess": true
}

    如上,通過(guò)Http請(qǐng)求模擬,我們實(shí)現(xiàn)了訂單服務(wù)對(duì)消息服務(wù)的依賴。

二、在單元測(cè)試中使用

    單元測(cè)試中,針對(duì)模擬應(yīng)答的配置是一樣的,我們可以通過(guò)測(cè)試用例模擬各種不同的應(yīng)答,包括異常,來(lái)對(duì)執(zhí)行路徑進(jìn)行測(cè)試。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[Fact]
public async Task Test1()
{
    IServiceCollection services = new ServiceCollection()
        .AddExtensions();
 
    services.AddHttpClient("TESTCLIENT")
        .AddMockHttpMessageHandler()
        // 請(qǐng)求/test/exception將觸發(fā)異常
        .AddMock("/test/exception", HttpMethod.Get, new Exception(""))
        // 針對(duì) /test/404 返回404應(yīng)答
        .AddMock("/test/404", HttpMethod.Get, HttpStatusCode.NotFound)
        // 返回指定類型
        .AddMock<int>("/test/obj", HttpMethod.Get, 100)
        // 自定義條件及應(yīng)答
        .AddMock(request =>
        {
            if (request.Headers.Contains("hello"))
            {
                return true;
            }
            return false;
        }, async (request, response) =>
        {
            // 如果是調(diào)用第三方服務(wù),你可以在這里檢查request發(fā)出的請(qǐng)求內(nèi)容是否正確
 
            // 自定義應(yīng)答內(nèi)容
            await response.WriteObjectAsync(new
            {
                test = "Hello World"
            });
        })
        // 針對(duì)所有請(qǐng)求返回字符串Hello
        .AddMock("*", HttpMethod.Get, "Hello");
 
    IServiceProvider provider = services.BuildServiceProvider();
 
    IHttpClientFactory clientFactory = provider.GetRequiredService<IHttpClientFactory>();
    HttpClient client = clientFactory.CreateClient("TESTCLIENT");
    client.BaseAddress = new Uri("http://localhost");
 
    HttpResponseMessage resposne = await client.GetAsync("/test/404");
    Assert.Equal(HttpStatusCode.NotFound, resposne.StatusCode);
}

三、示例

    詳細(xì)示例請(qǐng)參考GitHub

    Xfrogcn.AspNetCore.Extensions地址:GitHub Gitee

以上就是ASP.NET Core擴(kuò)展庫(kù)之Http請(qǐng)求模擬功能的使用的詳細(xì)內(nèi)容,更多關(guān)于ASP.NET Core Http請(qǐng)求模擬功能的使用的資料請(qǐng)關(guān)注服務(wù)器之家其它相關(guān)文章!

原文鏈接:https://www.cnblogs.com/xfrog/archive/2021/04/26/14703251.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 91久久 | 亚洲欧洲精品视频在线观看 | 亚洲精品欧美 | 国内精品视频在线观看 | 国产精品久久久久久久久大全 | 欧美一级一区 | www.一区二区| 欧美激情综合网 | 久久久久网站 | 亚洲 自拍 另类 欧美 丝袜 | 色狠狠网 | 91精品一久久香蕉国产线看观看新通道出现 | 美女久久| 欧美午夜精品久久久久久浪潮 | 国产精品一区二区无线 | 欧美一区三区 | 91欧美激情一区二区三区成人 | 伊人五月 | 久久天天操 | 国产欧美精品一区二区三区 | 国产精品久久久久久久久久新婚 | 婷婷精品久久久久久久久久不卡 | 亚洲午夜精品视频 | 高清日韩av | 99精品久久久久久久免费 | 欧美日韩一区二区三区免费视频 | 老牛嫩草一区二区三区眼镜 | 成人久久久精品国产乱码一区二区 | 亚洲a人| 一区二区三区在线播放 | 欧美日日| 天天天干天天天操 | 午夜小电影 | 中文字幕视频一区 | av一区二区三区四区 | 在线视频一区二区三区 | 亚洲国产欧美日韩 | 国产色| 黄色免费看片网站 | 久久久影院 | 国产羞羞视频免费在线观看 |