欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年04月26日 10:34:13   作者:xfrog  
這篇文章主要介紹了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é),如下圖所示:

    由于訂單服務(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.定義訂單類

    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)求類

    public class SendMessageRequest
    {
        public string MessageId { get; set; }

        public string Message { get; set; }

        public List<int> UserIds { get; set; }
    }

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

        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)啟模擬:

{
  "Mock": true
}

5.控制器

    [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)答:

{
    "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è)試。

        [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)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論