如何在 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 多商店工作