Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/xljiulang/WebApiClient.Extensions
WebApiClient项目的第三方扩展:Autofac、DependencyInjection、HttpClientFactory、SteeltoeOSS.Discovery、MessagePack、Protobuf、Json-Rpc
https://github.com/xljiulang/WebApiClient.Extensions
autofac dependency-injection discoveryclient httpclientfactory json-rpc messagepack protobuf webapiclient
Last synced: about 2 months ago
JSON representation
WebApiClient项目的第三方扩展:Autofac、DependencyInjection、HttpClientFactory、SteeltoeOSS.Discovery、MessagePack、Protobuf、Json-Rpc
- Host: GitHub
- URL: https://github.com/xljiulang/WebApiClient.Extensions
- Owner: xljiulang
- License: mit
- Created: 2018-09-22T19:28:08.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2020-05-25T08:17:17.000Z (over 4 years ago)
- Last Synced: 2024-11-09T02:52:27.533Z (about 2 months ago)
- Topics: autofac, dependency-injection, discoveryclient, httpclientfactory, json-rpc, messagepack, protobuf, webapiclient
- Language: C#
- Homepage:
- Size: 43.9 KB
- Stars: 71
- Watchers: 5
- Forks: 20
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# WebApiClient.Extensions
[WebApiClient](https://github.com/dotnetcore/WebApiClient)项目的第三方扩展:[Autofac](https://github.com/autofac/Autofac)、[DependencyInjection](https://github.com/aspnet/DependencyInjection)、[HttpClientFactory](https://github.com/aspnet/HttpClientFactory)、[SteeltoeOSS.Discovery](https://github.com/SteeltoeOSS/Discovery)、[MessagePack](https://github.com/neuecc/MessagePack-CSharp)、[Protobuf](https://github.com/mgravell/protobuf-net)、[Json-Rpc](https://www.jsonrpc.org/specification)### 0 Autofac扩展
#### 0.1 Nuget
PM> `install-package WebApiClient.Extensions.Autofac`
支持 netstandard1.3#### 0.2 使用方法
> 声明远程http服务的的WebApiClient调用接口```c#
[HttpHost("https:/localhost:5000")]
public interface IValuesApi : IHttpApi
{
[HttpGet("api/values")]
ITask GetAsync();[HttpGet("api/values/{id}")]
ITask GetAsync(int id);
}
```
> 注册和配置接口
```c#
var builder = new ContainerBuilder();
builder.RegisterHttpApi().ConfigureHttpApiConfig(c =>
{
c.HttpHost = new Uri("http://localhost:9999/");
c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
});
```### 1 DependencyInjection扩展
#### 1.1 Nuget
PM> `install-package WebApiClient.Extensions.DependencyInjection`
支持 netstandard2.0#### 1.2 使用方法
> 声明远程http服务的的WebApiClient调用接口```c#
[HttpHost("https:/localhost:5000")]
public interface IValuesApi : IHttpApi
{
[HttpGet("api/values")]
ITask GetAsync();[HttpGet("api/values/{id}")]
ITask GetAsync(int id);
}
```> Startup相关配置
```c#
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpApi().ConfigureHttpApiConfig(c =>
{
c.HttpHost = new Uri("http://localhost:9999/");
c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
});
...
}
```> Controller
```c#
public class HomeController : Controller
{
public async Task Index([FromServices]IValuesApi api, int id = 0)
{
var values = await api.GetValuesAsync();
var value = await api.GetValuesAsync(id);
return "ok";
}
}
```### 2 HttpClientFactory扩展
#### 2.1 Nuget
PM> `install-package WebApiClient.Extensions.HttpClientFactory`
支持 netstandard2.0#### 2.2 使用方法
> 声明远程http服务的的WebApiClient调用接口```c#
[HttpHost("https:/localhost:5000")]
public interface IValuesApi : IHttpApi
{
[HttpGet("api/values")]
ITask GetAsync();[HttpGet("api/values/{id}")]
ITask GetAsync(int id);
}
```> Startup相关配置
```c#
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpApiTypedClient(c =>
{
c.HttpHost = new Uri("http://localhost:9999/");
c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
});
...
}
```> Controller
```c#
public class HomeController : Controller
{
public async Task Index([FromServices]IValuesApi api, int id = 0)
{
var values = await api.GetAsync();
var value = await api.GetAsync(id);
return "ok";
}
}
```
### 3 DiscoveryClient扩展#### 3.1 Nuget
PM> `install-package WebApiClient.Extensions.DiscoveryClient`
支持 netstandard2.0#### 3.2 使用方法
> 声明微服务的WebApiClient调用接口```c#
[HttpHost("http://VALUES")]
public interface IValuesApi : IHttpApi
{
[HttpGet("api/values")]
ITask GetAsync();[HttpGet("api/values/{id}")]
ITask GetAsync(int id);
}
```> Startup相关配置
```c#
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDiscoveryClient(Configuration);
services.AddDiscoveryTypedClient(c =>
{
c.FormatOptions.DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
});
...
}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseDiscoveryClient();
}
```> Controller
```c#
public class HomeController : Controller
{
public async Task Index([FromServices]IValuesApi api, int id = 0)
{
var values = await api.GetAsync();
var value = await api.GetAsync(id);
return "ok";
}
}
```
### 4 MessagePack扩展#### 4.1 Nuget
PM> `install-package WebApiClient.Extensions.MessagePack `
支持 netstandard1.6 / net4.5#### 4.2 使用方法
> 声明远程http服务的的WebApiClient调用接口```c#
[MessagePackReturn]
[HttpHost("https:/localhost:5000")]
public interface IUsersApi : IHttpApi
{
[HttpGet("api/users/{id}")]
ITask GetAsync(int id);
[HttpPut("api/users")]
ITask PutAsync([MessagePackContent] UserInfo value);
}
```> `asp.net core`服务端MessagePack相关配置
```c#
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddMvcOptions(o =>
{
o.OutputFormatters.Add(new MessagePackOutputFormatter(ContractlessStandardResolver.Instance));
o.InputFormatters.Add(new MessagePackInputFormatter(ContractlessStandardResolver.Instance));
});
}class MessagePackInputFormatter : InputFormatter
{
private readonly IFormatterResolver resolver;private static readonly StringSegment mediaType = new StringSegment("application/x-msgpack");
public MessagePackInputFormatter(IFormatterResolver resolver)
{
this.resolver = resolver ?? MessagePackSerializer.DefaultResolver;
this.SupportedMediaTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(mediaType));
}public override Task ReadRequestBodyAsync(InputFormatterContext context)
{
var body = context.HttpContext.Request.Body;
var result = MessagePackSerializer.NonGeneric.Deserialize(context.ModelType, body, resolver);
return InputFormatterResult.SuccessAsync(result);
}
}class MessagePackOutputFormatter : OutputFormatter
{
private readonly IFormatterResolver resolver;private static readonly StringSegment mediaType = new StringSegment("application/x-msgpack");
public MessagePackOutputFormatter(IFormatterResolver resolver)
{
this.resolver = resolver ?? MessagePackSerializer.DefaultResolver;
this.SupportedMediaTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(mediaType));
}public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
{
if (context.ObjectType != typeof(object))
{
MessagePackSerializer.NonGeneric.Serialize(context.ObjectType, context.HttpContext.Response.Body, context.Object, resolver);
}
else if (context.Object == null)
{
context.HttpContext.Response.Body.WriteByte(MessagePackCode.Nil);
}
else
{
MessagePackSerializer.NonGeneric.Serialize(context.Object.GetType(), context.HttpContext.Response.Body, context.Object, resolver);
}context.ContentType = mediaType;
return Task.CompletedTask;
}
}
```
### 5 Protobuf扩展
#### 4.1 Nuget
PM> `install-package WebApiClient.Extensions.Protobuf`
支持 netstandard1.3 / net4.5#### 4.2 使用方法
> 声明远程http服务的的WebApiClient调用接口```c#
[ProtobufReturn]
[HttpHost("https:/localhost:5000")]
public interface IUsersApi : IHttpApi
{
[HttpGet("api/users/{id}")]
ITask GetAsync(int id);
[HttpPut("api/users")]
ITask PutAsync([ProtobufContent] UserInfo value);
}
```> `asp.net core`服务端MessagePack相关配置
```c#
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1).AddMvcOptions(o =>
{
o.OutputFormatters.Add(new ProtobufOutputFormatter());
o.InputFormatters.Add(new ProtobufInputFormatter());
});
}class ProtobufInputFormatter : InputFormatter
{
private static readonly StringSegment mediaType = new StringSegment("application/x-protobuf");public ProtobufInputFormatter()
{
this.SupportedMediaTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(mediaType));
}public override Task ReadRequestBodyAsync(InputFormatterContext context)
{
var body = context.HttpContext.Request.Body;
var model = Serializer.NonGeneric.Deserialize(context.ModelType, body);
return InputFormatterResult.SuccessAsync(model);
}
}class ProtobufOutputFormatter : OutputFormatter
{
private static readonly StringSegment mediaType = new StringSegment("application/x-protobuf");public ProtobufOutputFormatter()
{
this.SupportedMediaTypes.Add(new Microsoft.Net.Http.Headers.MediaTypeHeaderValue(mediaType));
}public override Task WriteResponseBodyAsync(OutputFormatterWriteContext context)
{
var body = context.HttpContext.Response.Body;
Serializer.NonGeneric.Serialize(body, context.Object);
context.ContentType = mediaType;
return Task.CompletedTask;
}
}
```
### 6 Json-Rpc扩展
#### 6.1 Nuget
PM> `install-package WebApiClient.Extensions.JsonRpc`
支持 netstandard1.3 / net4.5#### 4.2 使用方法
> 声明远程Rpc服务的的WebApiClient调用接口```c#
[HttpHost("http://localhost:6800/jsonrpc")]
public interface Aria2 : IHttpApi
{
[JsonRpcMethod("aria2.addUri")]
ITask> AddUriAsync([RpcParam] params string[] uri);
}
```