Skip to content

Latest commit

 

History

209 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

МойСклад C# SDK

Поддерживаемые API:

  • Remap API v1.2

Навигация

dotnet add package Confiti.MoySklad.Remap.Sdk
var credentials = new MoySkladCredentials()
{
    AccessToken = "your-access-token"
    // или
    Username = "your-username",
    Password = "your-password",
};
var api = new MoySkladApi(credentials);
var response = await api.Entity.Assortment.GetAllAsync();

Создайте свой HttpClient

var httpClient = new HttpClient(new HttpClientHandler()
{
    // gZip обязателен
    AutomaticDecompression = DecompressionMethods.GZip
});
var credentials = new MoySkladCredentials()
{
    AccessToken = "your-access-token"
};
var api = new MoySkladApi(credentials, httpClient);

или добавьте в IServiceCollection

services
    .AddHttpClient<MoySkladApi, MoySkladApi>(httpClient =>
    {
        return new MoySkladApi(new MoySkladCredentials { AccessToken = "your-access-token" }, httpClient);
    })
    .ConfigureHttpMessageHandlerBuilder(builder =>
    {
        if (builder.PrimaryHandler is HttpClientHandler httpClientHandler)
            httpClientHandler.AutomaticDecompression = DecompressionMethods.GZip;
    });
try
{
    await api.Entity.Counterparty.GetAllAsync();
}
catch (MoySkladException ex)
{
    // обработать код ошибки
    if (ex.ErrorCode == 404) { ... }

    // обработать ошибки
    foreach (var error in ex.Errors) { ... }

    // полное описание ошибки
    // cодержит все коды/описания по каждой ошибке из ex.Errors.
    _logger.Log(ex.Message);
}
var response = await api.Security.Token.GetAsync(new MoySkladCredentials
{
    Username = "new-username",
    Password = "new-password",
});
var accessToken = response.Payload.AccessToken;
var imagesResponse = await api.Entity.Product.Images.GetAllAsync(Guid.Parse("product-id"));

foreach (var image in imagesResponse.Payload.Rows)
{
    var imageDataResponse = await api.Entity.Product.Images.DownloadAsync(image);

    await using (imageDataResponse.Payload)
    {
        if (imageDataResponse.Payload is MemoryStream memoryStream)
        {
            var imageData = memoryStream.ToArray();

            // обработать изображение
        }
    }
}
await api.Entity.Product.Metadata.GetAsync();
var response = await api.Entity.Assortment.GetAllAsync(query => 
{
    // фильтр '='
    query.FilterBy(p => p.Name).Should().Be("foo");

    // фильтр '=' по коду в виде строки
    query.FilterBy("code").Should().Be("bar");

    // вложенный фильтр '='
    query.FilterBy(p => p.Alcoholic.Type).Should().Be(123);

    // множественный фильтр '='
    query.FilterBy(p => p.Archived).Should().Be(true).Or.Be(false);

    // фильтр '~'
    query.FilterBy(p => p.Article).Should().Contains("foo");

    // фильтр '~='
    query.FilterBy(p => p.Barcode).Should().StartsWith("foo");

    // фильтр '>=' и '<='
    query.FilterBy(p => p.Updated).Should()
        .BeGreaterOrEqualTo(DateTime.Parse("2020-07-10 12:00:00"))
        .And
        .BeLessOrEqualTo(DateTime.Parse("2020-07-12 12:00:00"));

    // фильтр по пользовательскому полю
    query.FilterBy("your-custom-attribute-href").Should().Be(123);

    // фильтр по складу по ссылке
    query.FilterBy(p => p.StockStore).Should().Be("https://api.moysklad.ru/api/remap/1.2/entity/store/59a894aa-0ea3-11ea-0a80-006c00081b5b");
    // или с объектом Store
    query.FilterBy(p => p.StockStore).Should().Be(store);
});
var response = await api.Entity.Assortment.GetAllAsync(query => 
{
    query.OrderBy(p => p.Name)
        // или по любой строке
        .ThenBy("your-custom-property-name");

    // по убыванию
    query.OrderBy(p => p.Name, OrderBy.Desc)
});
var response = await api.Entity.Assortment.GetAllAsync(query => 
{
    query.Limit(100);
    query.Offset(50);
});
var response = await api.Entity.Assortment.GetAllAsync(query => 
{
    query.Search("foo");
});
var response = await api.Entity.Assortment.GetAllAsync(query => 
{
    query.GroupBy(GroupBy.Consignment);
});
var response = await api.Entity.Assortment.GetAllAsync(query => 
{
    query.ExpandBy(p => p.Images)
        .ThenBy(p => p.Product)
        // вложенный
        .ThenBy(p => p.SalePrices.Currency)
        .ThenBy(p => p.BuyPrice.Currency)
        .ThenBy(p => p.Product.SalePrices.Currency)
        .ThenBy(p => p.Product.BuyPrice.Currency)
        // или по любой строке
        .ThenBy("salePrices.currency")
});

В корневой папке в файле build.ps1 укажите API_LOGIN и API_PASSWORD

  build.ps1
# Enter your login and password
# $Env:API_LOGIN = "enter-your-api-login-here"
# $Env:API_PASSWORD = "enter-your-api-password-here"

Я открыт для любого сотрудничества и расширения функционала данного проекта. Pull requests приветствуются, однако сначала откройте issue для обсуждения.

Если вам понравился данный проект, воткните ⭐

About

МойСклад C# API client

Topics

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages