Magento – How to use access Magento 2 API from C# with REST and Token-based authentication

apicmagento2rest

I create an Integration -> Activate -> Obtained the Access Token

Like is described here: http://devdocs.magento.com/guides/v2.2/get-started/authentication/gs-authentication-token.html

And in my test project I get this in response object:
Content:

"{\"message\":\"Consumer is not authorized to access %resources\",\"parameters\":{\"resources\":\"Magento_Catalog::categories\"}}"
StatusCode:
System.Net.HttpStatusCode.Unauthorized

I create a class Magento:

public class Magento
{
    private RestClient Client { get; set; }
    private string Token { get; set; }

    public Magento(string magentoUrl, string token)
    {
        Token = token;
        Client = new RestClient(magentoUrl);
    }

    private RestRequest CreateRequest(string endPoint, Method method, string token)
    {
        var request = new RestRequest(endPoint, method);
        request.RequestFormat = DataFormat.Json;
        request.AddHeader("Authorization", "Bearer " + token);
        request.AddHeader("Accept", "application/json");
        return request;
    }

    public string CreateCategory(int id, int ParentId, string categoryName, bool IsActive, bool IncludeInMenu)
    {
        var request = CreateRequest("/rest/V1/categories", Method.POST, Token);
        var cat = new ProductCategory();
        var category = new Category();
        category.Id = id;
        category.ParentId = ParentId;
        category.Name = categoryName;
        category.IsActive = IsActive;
        category.IncludeInMenu = IncludeInMenu;
        cat.Category = category;

        string json = JsonConvert.SerializeObject(cat, Formatting.Indented);

        request.AddParameter("application/json", json, ParameterType.RequestBody);

        var response = Client.Execute(request);
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            return response.Content;
        }
        else
        {
            return ":(" + response.Content;
        }
    }


    public void GetSku(string token, string sku)
    {
        var request = CreateRequest("/rest/V1/products/" + sku, Method.GET, token);

        var response = Client.Execute(request);

        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            M2Product product = JsonConvert.DeserializeObject<M2Product>(response.Content);

        }

    }

    public string CreateCategory(string categoryName)
    {
        var request = CreateRequest("/rest/V1/categories", Method.POST, Token);
        var cat = new ProductCategory();
        var category = new Category();
        category.Name = categoryName;
        cat.Category = category;

        string json = JsonConvert.SerializeObject(cat, Formatting.Indented);

        request.AddParameter("application/json", json, ParameterType.RequestBody);

        var response = Client.Execute(request);
        if (response.StatusCode == System.Net.HttpStatusCode.OK)
        {
            return response.Content;
        }
        else
        {
            return ":( "+ response.Content;
        }
    }

}

public class ProductCategory
{

    [JsonProperty("category")]
    public Category Category { get; set; }
}

public class Category
{

    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("parent_id")]
    public int ParentId { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("is_active")]
    public bool IsActive { get; set; }

    [JsonProperty("position")]
    public int Position { get; set; }

    [JsonProperty("level")]
    public int Level { get; set; }

    [JsonProperty("children")]
    public string Children { get; set; }

    [JsonProperty("created_at")]
    public string CreatedAt { get; set; }

    [JsonProperty("updated_at")]
    public string UpdatedAt { get; set; }

    [JsonProperty("path")]
    public string Path { get; set; }

    [JsonProperty("available_sort_by")]
    public IList<string> AvailableSortBy { get; set; }

    [JsonProperty("include_in_menu")]
    public bool IncludeInMenu { get; set; }

}

public class StockItem
{

    [JsonProperty("item_id")]
    public int ItemId { get; set; }

    [JsonProperty("product_id")]
    public int ProductId { get; set; }

    [JsonProperty("stock_id")]
    public int StockId { get; set; }

    [JsonProperty("qty")]
    public int Qty { get; set; }

    [JsonProperty("is_in_stock")]
    public bool IsInStock { get; set; }

    [JsonProperty("is_qty_decimal")]
    public bool IsQtyDecimal { get; set; }

    [JsonProperty("show_default_notification_message")]
    public bool ShowDefaultNotificationMessage { get; set; }

    [JsonProperty("use_config_min_qty")]
    public bool UseConfigMinQty { get; set; }

    [JsonProperty("min_qty")]
    public int MinQty { get; set; }

    [JsonProperty("use_config_min_sale_qty")]
    public int UseConfigMinSaleQty { get; set; }

    [JsonProperty("min_sale_qty")]
    public int MinSaleQty { get; set; }

    [JsonProperty("use_config_max_sale_qty")]
    public bool UseConfigMaxSaleQty { get; set; }

    [JsonProperty("max_sale_qty")]
    public int MaxSaleQty { get; set; }

    [JsonProperty("use_config_backorders")]
    public bool UseConfigBackorders { get; set; }

    [JsonProperty("backorders")]
    public int Backorders { get; set; }

    [JsonProperty("use_config_notify_stock_qty")]
    public bool UseConfigNotifyStockQty { get; set; }

    [JsonProperty("notify_stock_qty")]
    public int NotifyStockQty { get; set; }

    [JsonProperty("use_config_qty_increments")]
    public bool UseConfigQtyIncrements { get; set; }

    [JsonProperty("qty_increments")]
    public int QtyIncrements { get; set; }

    [JsonProperty("use_config_enable_qty_inc")]
    public bool UseConfigEnableQtyInc { get; set; }

    [JsonProperty("enable_qty_increments")]
    public bool EnableQtyIncrements { get; set; }

    [JsonProperty("use_config_manage_stock")]
    public bool UseConfigManageStock { get; set; }

    [JsonProperty("manage_stock")]
    public bool ManageStock { get; set; }

    [JsonProperty("low_stock_date")]
    public object LowStockDate { get; set; }

    [JsonProperty("is_decimal_divided")]
    public bool IsDecimalDivided { get; set; }

    [JsonProperty("stock_status_changed_auto")]
    public int StockStatusChangedAuto { get; set; }
}

public class ExtensionAttributes
{

    [JsonProperty("stock_item")]
    public StockItem StockItem { get; set; }
}

public class CustomAttribute
{

    [JsonProperty("attribute_code")]
    public string AttributeCode { get; set; }

    [JsonProperty("value")]
    public object Value { get; set; }
}

public class M2Product
{

    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("sku")]
    public string Sku { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("attribute_set_id")]
    public int AttributeSetId { get; set; }

    [JsonProperty("price")]
    public int Price { get; set; }

    [JsonProperty("status")]
    public int Status { get; set; }

    [JsonProperty("visibility")]
    public int Visibility { get; set; }

    [JsonProperty("type_id")]
    public string TypeId { get; set; }

    [JsonProperty("created_at")]
    public string CreatedAt { get; set; }

    [JsonProperty("updated_at")]
    public string UpdatedAt { get; set; }

    [JsonProperty("extension_attributes")]
    public ExtensionAttributes ExtensionAttributes { get; set; }

    [JsonProperty("product_links")]
    public IList<object> ProductLinks { get; set; }

    [JsonProperty("options")]
    public IList<object> Options { get; set; }

    [JsonProperty("media_gallery_entries")]
    public IList<object> MediaGalleryEntries { get; set; }

    [JsonProperty("tier_prices")]
    public IList<object> TierPrices { get; set; }

    [JsonProperty("custom_attributes")]
    public IList<CustomAttribute> CustomAttributes { get; set; }
}

And a form

public partial class Form1 : Form
{
    static private string siteAddress = "http://magento.com/";
    static private string token = "d21312d97hosbblablablaqtqawlbw";
    Magento objMagneto;

    public Form1()
    {
        InitializeComponent();
        objMagneto = new Magento(siteAddress, token);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void adgClasa_Click(object sender, EventArgs e)
    {
        MessageBox.Show(objMagneto.CreateCategory(10, 0, "PC Components", true, true)); // id, ParentId, name, IsActive, IncludeInMenu

    }

}

Best Answer

I see you are using RestClient and Newtonsoft Json both great libraries!

Using the 2.2 REST API and RestClient I use the following: -

var client = new RestClient(<endpoint>)
{
  Encoding = Encoding.UTF8,
  Authenticator = OAuth1Authenticator.ForProtectedResource(<ConsumerKey>, <ConsumerSecret>, <AccessToken>, <AccessTokenSecret>)
};
var request = new RestRequest("rest/V1/categories", Method.POST);
request.AddHeader("Content-Type", "application/json");
request.Parameters.Add(new Parameter("category", JsonConvert.SerializeObject(new { category }, Formatting.None), ContentType.Json, ParameterType.RequestBody));
var response = client.Execute(request);
var returnedObject = JsonConvert.DeserializeObject<McomCategory>(response.Content);
Related Topic