首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用

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

作者头像
张善友
发布2021-08-10 10:49:35
发布2021-08-10 10:49:35
8070
举报
文章被收录于专栏:张善友的专栏张善友的专栏

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

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

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); }

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

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 一起玩耍了。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-08-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档