Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

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

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