如何在 C# 中使用 Magento 2 API 创建 REST 请求?

Posted

技术标签:

【中文标题】如何在 C# 中使用 Magento 2 API 创建 REST 请求?【英文标题】:How to create REST requests with Magento 2 API in C#? 【发布时间】:2017-10-11 08:31:24 【问题描述】:

我做了一个小项目来测试 C# 和 Magento 2 API 之间的通信。我遵循了一些教程,但没有找到功能示例。

1。 当我与管理员用户“/rest/V1/integration/admin/token”连接时,请求返回令牌,但是当我尝试使用“/rest/V1/categories”添加类别时,这是请求的响应: "message":"消费者无权访问 %resources","parameters":"resources":"Magento_Catalog::categories"

    当我尝试连接客户用户(apiuser)“/rest/V1/integration/customer/token”时,请求的响应是“您没有正确登录或您的帐户被暂时禁用。”

apiuser 具有角色“Web 服务角色”和“Web 服务角色”具有角色资源:“全部”

using Newtonsoft.Json;
using RestSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MagentoRestApi

public class Magento

    private RestClient Client  get; set; 
    private string Token  get; set; 

    public Magento(string magentoUrl, string userName, string passWord)
    
        Client = new RestClient(magentoUrl);
        Token = GetAdminToken(userName, passWord);
    

    public string GetAdminToken(string userName, string passWord)
    
        var request = CreateRequest("/rest/V1/integration/admin/token", Method.POST);
        //var request = CreateRequest("/rest/V1/integration/customer/token", Method.POST);
        var user = new Credentials();
        user.username = userName;
        user.password = passWord;

        string json = JsonConvert.SerializeObject(user, 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 "";
        
    

    private RestRequest CreateRequest(string endPoint, Method method)
    
        var request = new RestRequest(endPoint, method);
        request.RequestFormat = DataFormat.Json;
        return request;
    

    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 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;
        
    

    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 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; 



以及表单代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MagentoRestApi

public partial class Form1 : Form

    //static private string userName = "apiuser";
    //static private string passWord = "blablabla";

    static private string userName = "admin";
    static private string passWord = "albalbalb"; 
    static private string siteAddress = "http://magento.nxm.ro/";
    Magento objMagneto;

    public Form1()
    
        InitializeComponent();
        objMagneto = new Magento(siteAddress, userName, passWord);
    

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

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



【问题讨论】:

【参考方案1】:

注意你的令牌,它带有额外的字符 使用这样的东西:

token = token.Replace("\"", "");

你有创建新产品的代码吗?

【讨论】:

以上是关于如何在 C# 中使用 Magento 2 API 创建 REST 请求?的主要内容,如果未能解决你的问题,请参考以下文章

Magento 2:如何在 Paypal Express 中即时更改付款方式

如何使用 facebook 应用程序让 magento 多商店工作

Magento 2 REST API

用于添加产品愿望清单的 Magento 自定义 API

用于 PayPal 模块的 Magento 2 REST api

Magento:通过 API 删除产品后更新购物车总数