Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用

使用Dapr 客户端 处理服务调用,需要遵循的他的模式,通常代码是这个样子的:

var client = DaprClient.CreateInvokeHttpClient(appId: "routing");
var response = await client.GetAsJsonAsync($"/accounts/{17}", cancellationToken);
var account = await response.Content.ReadFromJsonAsync<Account>(cancellationToken: cancellationToken);
我更希望是这样子调用:

public interface IBank
{
            [HttpGet("/accounts/{accountId}")]
            Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);

           [HttpPost("/deposit")]
            Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

           [HttpPost("/withdraw")]
            [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
            Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}

var account = await bankClient.GetUser("17", cancellationToken);
我们可以用 Refit,RestEase 或者是 WebApiClientCore 来达到这样的效果, 那么在Dapr 里面使用这些库如何做到呢, 在Dapr的客户端库里面有一个Handler 的官方实现:InvocationHandler。搭配这个InvocationHandler 就可以和这几个库,在本文中,我们重点介绍Dapr Client 如何搭配 WebApiClientCore。

public interface IBank
{
          [HttpGet("/accounts/{accountId}")]
          Task<Account> GetUser(string accountId, CancellationToken cancellationToken = default);

          [HttpPost("/deposit")]
          Task<Account> Deposit([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);

          [HttpPost("/withdraw")]
          [RawReturn(Enable =true, EnsureSuccessStatusCode = false)]
          Task<HttpResponseMessage> Withdraw([JsonContent] Transaction transaction, CancellationToken cancellationToken = default);
}

  public class WebapiClientExample : Example
   {
       public override string DisplayName => "WebapiClient";

      private IBank bankClient;

      public WebapiClientExample(IBank bank)
       {
           bankClient = bank;
       }

      public override async Task RunAsync(CancellationToken cancellationToken)
       {
           var options = new JsonSerializerOptions(JsonSerializerDefaults.Web);


           // Scenario 1: Check if the account already exists.
           Account? account = null;
           try
           {
               account = await bankClient.GetUser("17", cancellationToken);
           }
           catch (ApiException ex)
           {
               // Account does not exist.
           }

          Console.WriteLine($"Scenario 1: account '17' {(account is null ? "does not exist" : "already exists")}");

          // Scenario 2: Deposit some money
           var transaction = new Transaction()
           {
               Amount = 100m,
               Id = "17",
           };

          // read updated balance
           account = await bankClient.Deposit(transaction, cancellationToken);
           Console.WriteLine($"Scenario 2: account '17' has '{account?.Balance}' money");

          // Scenario 3: Handle a validation error without exceptions
           transaction = new Transaction()
           {
               Amount = 1_000_000m,
               Id = "17",
           };
           HttpResponseMessage response = null;

          response = await bankClient.Withdraw(transaction, cancellationToken);
           if (response.StatusCode != HttpStatusCode.BadRequest)
           {
               // We don't actually expect this example to succeed - we expect a 400
               Console.WriteLine("Something went wrong :(");
               return;
           }
           var problem = await response.Content.ReadFromJsonAsync<ProblemDetails>(cancellationToken: cancellationToken);
           Console.WriteLine($"Scenario 3: got the following errors:");
           foreach (var kvp in problem!.Errors)
           {
               Console.WriteLine($"{kvp.Key}: {string.Join(", ", kvp.Value)}");
           }
       }
   }

var services = new ServiceCollection();
             services.AddTransient<Example, WebapiClientExample>();
             services.AddLogging();

            services
                 .AddScoped<InvocationHandler>()
                 .AddHttpApi<WebapiClientExample.IBank>(o => o.HttpHost = new Uri("http://bank"))
                 .AddHttpMessageHandler<InvocationHandler>();
            var serviceprovider = services.BuildServiceProvider();

代码的核心部分就在于上面红色的部分,我们把InvocationHandler 加入到AddHttpApi ,就可以和 dapr 一起玩耍了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win32下Socket编程(1)

一.win32的socket编程&#xff0c;是socket编程中比较经典也比较基础的一部分&#xff0c;根据传输方式和协议的区别&#xff0c;可以简单的分为TCP传递和UDP传递两种。这篇文章主要是阐述基于TCP的Socket编程。 二.Socket相关API 1.WSAStartup int WSAStartup( __in WORD wVer…

掉入黑洞会怎样?被拉成面条,还是前往另一个宇宙?

全世界只有3.14 % 的人关注了青少年数学之旅○ 黑洞通往何处&#xff1f;现在&#xff0c;你准备好要跳入一个黑洞。如果你能想办法活下来&#xff08;尽管这困难重重&#xff09;&#xff0c;等待着你的是什么呢&#xff1f;如果你想方设法地要回头&#xff0c;最终你会去到哪…

程序员技术练级攻略(转载)

谨以此文献给仍碌碌无为&#xff0c;却渴望成功的Me!,码农路漫漫,需要有一颗坚定的心 本文转载自左耳朵耗子的博文,地址:http://coolshell.cn/articles/4990.html 月光博客6月12日发表了《写给新手程序员的一封信》&#xff0c;翻译自《An open letter to those who want to st…

理论修炼之ETCD,高一致性Key-Value服务提供者中的佼佼者

????欢迎点赞 &#xff1a;???? 收藏 ⭐留言 ???? 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;????本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】????作者格言&#xff1a;生活在于折腾&#xff0c;当你不折…

反射学习系列3-反射实例应用

反射学习系列目录 反射学习系列1-反射入门 反射学习系列2-特性&#xff08;Attribute&#xff09; 反射学习系列3-反射实例应用 作者 例子这个东西其实挺难弄得,弄个简单的,虽然能说明问题但却容易让人觉得没实用价值,弄个有实用价值却又往往牵扯很多别的技术甚至牵扯很多业务…

怎么向女朋友解释什么叫区块链?

全世界只有3.14 % 的人关注了青少年数学之旅现在最火热的科技和风口&#xff0c;无疑就是“区块链”了。很多投行面试中也总是会被问到 于是&#xff0c;发生了下面的故事……有一对恩爱的男女朋友开始了这样的对话&#xff0c;我们暂且叫他们小明和小花吧。&#xff08;将就点…

遭遇价格欺诈

周末和朋友逛街时&#xff0c;买了副皮手套&#xff0c;店家说帮朋友代卖的&#xff0c;标价318元&#xff0c;打五折&#xff0c;又跟店家讲了下价&#xff0c;虽然店家表现的老大不情愿&#xff0c;但最终还是以130买进。 回家后顺手从网上查了下&#xff0c;淘宝网上才卖75&…

超详细图解!【MySQL进阶篇】MySQL索引原理

索引类型 索引可以提升查询速度&#xff0c;会影响where查询&#xff0c;以及order by排序。MySQL索引类型如下&#xff1a; 从索引存储结构划分&#xff1a;B Tree索引、Hash索引、FULLTEXT全文索引、R Tree索引 从应用层次划分&#xff1a;普通索引、唯一索引、主键索引、复…

Sql plus命令报command not found的解决笔记

Sql plus命令报command not found的解决笔记1.问题描述 环境&#xff1a;linux9, Oracle10g. 在一台装有Oracle10g的Linux机器上&#xff0c;我运行sqlplus命令&#xff0c;报错"command not found",运行别的命令(如:lsnrctl)也同样的错误。初步怀疑是路径问题&#…

ExtJs学习笔记(21)-使用XTemplate结合WCF显示数据

个人认为&#xff0c;XTemplate是ExtJs中最灵活的用来显示数据的组件&#xff0c;有点类似aspx中的Repeater控件&#xff0c;显示数据的模板完全可以由用户以html方式来定制. 先给一个官方的静态示例(稍微改了下)&#xff0c;代码并不复杂&#xff0c;关键的地方&#xff0c;我…

Blazor 路由及导航开发指南

翻译自 Waqas Anwar 2021年4月2日的文章 《A Developer’s Guide To Blazor Routing and Navigation》 [1]检查传入的请求 URL 并将它们导航到对应的视图或页面是每个单页应用程序 (SPA) 框架的基本功能。Blazor Server 和 WebAssembly 应用程序也同样支持使用一些内置组件和服…

超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件Management Services & Utilities : 管理服务和工具组件SQL Interface : SQL接口组件Parser : 查询分析器组件Optimizer : 优化器组件Caches & Buffers : 缓冲池组件Pluggable Storag…

数据之美

数据是抽象的&#xff0c;尤其是海量数据&#xff0c;人的大脑很难直接对大量数据进行分析并获得印象&#xff0c;然而从另一个角度看&#xff0c;数据也可以异常美丽&#xff0c;人们设计了很多工具&#xff0c;让枯燥的数据图形化&#xff0c;本文介绍了50个数据图形化工具&a…

第十七章 特殊类成员

第十七章 特殊类成员 1.1 静态成员变量 假如我们要在一个类中的所有对象间共享某种数据&#xff0c;那不妨将其设置为静态成员变量/函数&#xff1b; static x 1.2 静态成员变量 静态成员变量与成员变量有4点不同&#xff1a; ①前者属于类②前者必须在全局定义③前者被调用…

一个孩子能长大成人到底有多不容易? | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源警民直通车-上海&#xff0c;侵权删&#xff09;

差距50倍!为什么Web API第一次执行这么慢?

前言新建一个ASP.NET Core Web API项目&#xff0c;使用命令行方式启动&#xff0c;连续发送多次请求。从下图的时间线可以发现&#xff0c;第一次执行&#xff08;116ms&#xff09;比后面的&#xff08;2ms&#xff09;慢了很多:在这100多ms中&#xff0c;Web API到底做了些什…

Exchange服务器系列课程之四--管理Exchange收件人

前面已经讨论了Exchange的安装&#xff0c;今天我们来讨论一下Exchange服务器的用户管理。管理Exchange的工具在第二篇文章已经讨论过了&#xff0c;这里不再阐述。Exchange中的收件人对象有三种&#xff1a;用户&#xff0c;组&#xff0c;联系人。我们可以为收件人对象启用邮…

动力强劲的星型发动机,为何不用在汽车上呢?

全世界只有3.14 % 的人关注了青少年数学之旅星型发动机嘚瑟的模样&#xff0c;一定让人过目不忘——对&#xff0c;虽然它看起来妖娆&#xff0c;但动力却十分强劲。那它为什么没在汽车上普及呢&#xff1f;我们一起来看看&#xff01;什么是星型发动机星型发动机&#xff0c;顾…

超详细图解!【MySQL进阶篇】存储过程,视图,索引,函数,触发器

超详细图解&#xff01;【MySQL进阶篇】存储过程,视图,索引,函数,触发器1.1 下载Linux 安装包1.2 安装MySQL1.3 启动 MySQL 服务1.4 登录MySQL2\. 索引2.1 索引概述2.2 索引优势劣势2.3 索引结构2.3.1 BTREE 结构2.3.3 BTREE 结构2.3.3 MySQL中的BTree2.4 索引分类2.5 索引语法…

Xcode中release和debug模式

本人对Xcode中的release模式和debug模式很是疑惑,于是今天对其进行的调研,写下笔记以备查阅Debug是调试版本,包含调试信息,并且不做任何优化,便于程序猿进行调试.Release 是发布版本,它往往是进行各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用.在上传…