Rest Lib - библиотека для общения сервисов между собой при помощи HTTP запросов / Rest Lib - a library for communication between services using HTTP requests
(ENG is below)
Rus
Rest Lib позволяет одному сервису вызывать функции другого сервиса с помощью HTTP запроса.
Рассмотрим пример использования, находится в папке Examples
- Common - общий код
- SampleDataServer - сервер, который содержит данные и которые вызывают другие сервисы
- SampleClient - десктоп клиент, который осуществляет запрос за данными к SampleDataServer
- SampleServer - сервер, который осуществляет запрос за данными к SampleDataServer
Схема взаимодействия следующая:
Порядок действий:
public interface IUsersGetter
{
Task<RestResponse<IReadOnlyCollection<User>>> GetUsersAsync(string filter);
}
[Route("data-server" + "/rest/" + nameof(IUsersGetter))]
[RestAuth]
public class UsersGetterController : IUsersGetter
{
private readonly IReadOnlyCollection<User> _users = ...
[HttpPost(nameof(IUsersGetter.GetUsersAsync))]
public async Task<RestResponse<IReadOnlyCollection<User>>> GetUsersAsync(string filter)
{
...
users = _users;
var result = new RestResponse<IReadOnlyCollection<User>>(users);
return await Task.FromResult(result);
}
}
В Startup классе необходимо добавить middlewares для обработок ошибок и для проверки аунтефикации запрос, а также добавить использование самой либы
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddRest();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRestExceptionHandling();
app.UseRestAuthentication();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
public class UsersGetterClient : RestClient, IUsersGetter
{
public UsersGetterClient(HttpClient httpClient, RestOptions restSettings) : base(ServiceName, httpClient, restSettings){}
public static string ServiceName => "data-server";
public async Task<RestResponse<IReadOnlyCollection<User>>> GetUsersAsync(string filter = "")
{
return await CallAsync<IReadOnlyCollection<User>, string>(
$"/{ServiceName}/rest/{nameof(IUsersGetter)}/{nameof(IUsersGetter.GetUsersAsync)}", filter);
}
}
В дальнейшем, чтобы использовать данный клиент, мы будет с помощью Dependency Injection лишь просить IUsersGetter
В классе Startup Добавим использование либы и использование UsersGetterClient
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddRest();
services.AddRestClient<IUsersGetter, UsersGetterClient>();
}
И далее в месте использования просим реализацию IUsersGetter и вызываем нужные метод
var response = await _client.GetUsersAsync();
Также необходимо добавить данные о сервисах и о токене в appsettings.json
"Rest": {
"RestToken": {
"Issuer": "Issuer",
"Audience": "Audience",
"IssuerSigningKey": "IssuerSigningKey",
"TokenDecryptionKey": "TokenDecryptionKey"
},
"Services": [
{
"Name": "data-server",
"Scheme": "http",
"Host": "localhost",
"Port": "10000"
}
]
},
Всё работает
Бибилиотека состоит из следующих модулей:
Является базовым модулем, содежащий весь код.
Соедржит примеры работы с библиотекой.
- Contributing приветствуеется, вы можете начать через создание issue в GitHub и открыть pull request после обсуждения в issue
- По возникающим вопросам просьба обращаться на iurii.aksenov@yandex.ru
- Баги и feature-реквесты можно направлять в раздел issues
Eng
Rest Lib позволяет одному сервису вызывать функции другого сервиса с помощью HTTP запроса.
You might wish to take a look at the sample application for the details Let's look at an example of use, located in the Examples folder
- Common - common code
- SampleDataServer - a server that contains data and which is called by other services
- SampleClient - a desktop client that makes a request for data to SampleDataServer
- SampleServer - a server that makes a request for data to SampleDataServer
The interaction scheme is as follows:
Steps:
public interface IUsersGetter
{
Task<RestResponse<IReadOnlyCollection<User>>> GetUsersAsync(string filter);
}
[Route("data-server" + "/rest/" + nameof(IUsersGetter))]
[RestAuth]
public class UsersGetterController : IUsersGetter
{
private readonly IReadOnlyCollection<User> _users = ...
[HttpPost(nameof(IUsersGetter.GetUsersAsync))]
public async Task<RestResponse<IReadOnlyCollection<User>>> GetUsersAsync(string filter)
{
...
users = _users;
var result = new RestResponse<IReadOnlyCollection<User>>(users);
return await Task.FromResult(result);
}
}
In the Startup class, you need to add middlewares for error handling and for checking the authentication of the request, as well as add the use of the lib itself
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddRest();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRestExceptionHandling();
app.UseRestAuthentication();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
public class UsersGetterClient : RestClient, IUsersGetter
{
public UsersGetterClient(HttpClient httpClient, RestOptions restSettings) : base(ServiceName, httpClient, restSettings){}
public static string ServiceName => "data-server";
public async Task<RestResponse<IReadOnlyCollection<User>>> GetUsersAsync(string filter = "")
{
return await CallAsync<IReadOnlyCollection<User>, string>(
$"/{ServiceName}/rest/{nameof(IUsersGetter)}/{nameof(IUsersGetter.GetUsersAsync)}", filter);
}
}
In order to use this client we are using Dependency Injection, we inject IUsersGetter
In the Startup class, add the use of RestLib and the use of UsersGetterClient
public void ConfigureServices(IServiceCollection services)
{
...
services.AddRest();
services.AddRestClient<IUsersGetter, UsersGetterClient>();
...
}
And then, at the place of use, ask for the IUsersGetter implementation and call the necessary methods
var response = await _client.GetUsersAsync();
You also need to add service and token data to appsettings.json
"Rest": {
"RestToken": {
"Issuer": "Issuer",
"Audience": "Audience",
"IssuerSigningKey": "IssuerSigningKey",
"TokenDecryptionKey": "TokenDecryptionKey"
},
"Services": [
{
"Name": "data-server",
"Scheme": "http",
"Host": "localhost",
"Port": "10000"
}
]
},
Everything works!
The library consists of the following modules:
It is the base module that contains all the code.
Contains examples of working with the library.
- Contributions are welcome, you can start by creating an issue on GitHub and opening a pull request after discussing the issue.
- If you have any questions, please contact iurii.aksenov@yandex.ru
- Bugs and feature requests can be sent to the issues section