2012-07-18 177 views
3

我在哪里可以找到样本说明如何连接到使用C#Magento的REST API?如何使用Magento的REST API从C#

我发现了一个PHP的一个我无法弄清楚,除了一点点。

使用Dropbox的OAuth的示例中,我在我试图使它成为Magento的工作网发现:

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    var consumerKey = “xxxxxxxxxxxxx”; 
    var consumerSecret = “xxxxxxxxxxxxxxxx”; 

    var uri = new Uri("http://www.MagentoWebsite.com/oauth/token"); 

    // Generate a signature 
    OAuthBase oAuth = new OAuthBase(); 
    string nonce = oAuth.GenerateNonce(); 
    string timeStamp = oAuth.GenerateTimeStamp(); 
    string parameters; 
    string normalizedUrl; 
    string signature = oAuth.GenerateSignature(uri, consumerKey, consumerSecret, 
    String.Empty, String.Empty, “GET”, timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, 
    out normalizedUrl, out parameters); 

    signature = HttpUtility.UrlEncode(signature); 

    StringBuilder requestUri = new StringBuilder(uri.ToString()); 
    requestUri.AppendFormat("?oauth_consumer_key={0}&", consumerKey); 
    requestUri.AppendFormat("oauth_nonce={0}&", nonce); 
    requestUri.AppendFormat("oauth_timestamp={0}&", timeStamp); 
    requestUri.AppendFormat("oauth_signature_method={0}&", “HMAC-SHA1"); 
    requestUri.AppendFormat("oauth_version={0}&", “1.0"); 
    requestUri.AppendFormat("oauth_signature={0}", signature); 

    var request = (HttpWebRequest)WebRequest.Create(new Uri(requestUri.ToString())); 
    request.Method = WebRequestMethods.Http.Get; 

    var response = request.GetResponse(); 

    var queryString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

    var parts = queryString.Split(’&’); 
    var token = parts[1].Substring(parts[1].IndexOf(’=’) + 1); 
    var tokenSecret = parts[0].Substring(parts[0].IndexOf(’=’) + 1); 

    queryString = String.Format("oauth_token={0}", token); 
    var authorizeUrl = “http://www.MagentoWebsite.com/admin/oauth_authorize?”+queryString; 
    Process.Start(authorizeUrl); 
} 

不幸的是这将返回BAD REQUEST响应。

+0

你在这里得到一个anwser?你能分享解决方案吗?欢呼声 – 2012-10-27 18:52:30

+1

我有同样的问题“坏请求”。你找到解决方案吗? – ihorko 2012-10-31 11:05:17

+0

抱歉有点迟来回应,但我找不到任何积极的解决方案来做到这一点呢。谢谢。 – 2012-11-03 08:46:13

回答

0

我不知道这是否有助于或没有,但一旦我能从Magento获得oauth_token和oauth_token_secret(我使用PHP Magento示例获取它)我可以通过将requestUri中的所有内容放入标头来查询REST API。

你举的例子帮助我得到的大部分代码正确,只是修改了一些(在这里是一个小片段):

  StringBuilder sb = new StringBuilder("OAuth "); 
      sb.AppendFormat("oauth_version={0},", "1.0"); 
      sb.AppendFormat("oauth_signature_method={0},", "HMAC-SHA1"); 
      sb.AppendFormat("oauth_nonce={0},", nonce); 
      sb.AppendFormat("oauth_timestamp={0},", timeStamp); 
      sb.AppendFormat("oauth_consumer_key={0},", consumerKey); 
      sb.AppendFormat("oauth_token={0},", oauth_token); 
      sb.AppendFormat("oauth_signature={0}", sig); 

      Debug.WriteLine(sb.ToString()); 
      var request = (HttpWebRequest)WebRequest.Create((resourceUrl)); 
      request.Headers[HttpRequestHeader.Authorization] = sb.ToString(); 
      request.ContentType = "text/xml"; 
      request.Accept = "text/xml"; 
      request.KeepAlive = true; 
      //request.Method = WebRequestMethods.Http.Get; 
      request.Method = "GET"; 

      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      Debug.WriteLine(response.StatusCode); 
      Debug.WriteLine(response.Server); 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 

       Stream responseStream = response.GetResponseStream(); 
       StreamReader responseReader = new StreamReader(responseStream); 
       XmlDocument xmlDoc = new XmlDocument(); 
       xmlDoc.Load(response.GetResponseStream()); 
       Dts.Variables["User::XML_Response"].Value = xmlDoc.OuterXml.ToString(); 

      } 

这是否帮助?

7

最近,我开始了一个C#REST API客户端项目的Magento可以帮助你了:

https://github.com/nickvane/Magento-RestApi

它没有完整的功能,但OAuth认证实现。 该代码使用restsharp,它支持oauth认证。

+0

它看起来不错,甚至有单元测试和nuget包的负载 - Magento.RestApi – user3791372 2016-11-29 01:03:53

1

我有同样的问题,但无法找到答案,因此我花了一天的时间来使它工作。我在这里分享我的代码,希望它能够帮助其他人使用该功能。

使用下面的代码在aspx页面来获得OAuth访问

 protected void Page_Load(object sender, EventArgs e) 
    { 
     string oauth_token = Request.QueryString["oauth_token"]; 
     string oauth_verifier = Request.QueryString["oauth_verifier"]; 

     if (string.IsNullOrEmpty(oauth_token) || string.IsNullOrEmpty(oauth_verifier)) 
     { 
      BeginAuthorization(); 
     } 
     else 
     { 
      Authorize(oauth_token,oauth_verifier); 
     } 
    } 

    private void Authorize(string oauth_token, string oauth_verifier) 
    { 
     var uri = new Uri(MagentoServer + "/oauth/token"); 
     string oauth_token_secret = (string)Session["oauth_token_secret"]; 

     OAuthBase oAuth = new OAuthBase(); 
     string nonce = oAuth.GenerateNonce(); 
     string timeStamp = oAuth.GenerateTimeStamp(); 
     string parameters; 
     string normalizedUrl; 
     string signature = oAuth.GenerateSignature(uri, ConsumerKey, ConsumerSecret, 
     oauth_token,oauth_token_secret, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.PLAINTEXT, 
     out normalizedUrl, out parameters); 

     StringBuilder sb = new StringBuilder("OAuth "); 
     sb.AppendFormat("oauth_verifier=\"{0}\",", oauth_verifier); 
     sb.AppendFormat("oauth_token=\"{0}\",", oauth_token); 
     sb.AppendFormat("oauth_version=\"{0}\",", "1.0"); 
     sb.AppendFormat("oauth_signature_method=\"{0}\",", "PLAINTEXT"); 
     sb.AppendFormat("oauth_nonce=\"{0}\",", nonce); 
     sb.AppendFormat("oauth_timestamp=\"{0}\",", timeStamp); 
     sb.AppendFormat("oauth_consumer_key=\"{0}\",", ConsumerKey); 
     sb.AppendFormat("oauth_signature=\"{0}\"", signature); 

     var request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Headers[HttpRequestHeader.Authorization] = sb.ToString(); 
     request.ContentType = "text/xml"; 
     request.Accept = "text/xml"; 
     request.KeepAlive = true; 
     request.Method = "POST"; 

     try 
     { 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 

       Stream responseStream = response.GetResponseStream(); 
       StreamReader responseReader = new StreamReader(responseStream); 
       string text = responseReader.ReadToEnd(); 
       try 
       { 
        Dictionary<String, string> responseDic = GetDictionaryFromQueryString(text); 

        string token = responseDic.First(q => q.Key == "oauth_token").Value; 
        string secret = responseDic.First(q => q.Key == "oauth_token_secret").Value; 

        Configuration objConfig = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~"); 
        AppSettingsSection objAppsettings = (AppSettingsSection)objConfig.GetSection("appSettings"); 
        //Edit 
        if (objAppsettings != null) 
        { 
         objAppsettings.Settings["Magento.Token"].Value = token; 
         objAppsettings.Settings["Magento.TokenSecret"].Value = secret; 
         objConfig.Save(); 
        } 

        errorLabel.Text = "Done"; 
        errorLabel.ForeColor = System.Drawing.Color.Green; 

       } 
       catch (Exception ex) 
       { 
        errorLabel.Text = "Exchanging token failed.<br>Response text = " + text + "<br>Exception = " + ex.Message; 
       } 
      } 
     } 
     catch (WebException ex) 
     { 
      var responseStream = ex.Response.GetResponseStream(); 
      StreamReader responseReader = new StreamReader(responseStream); 
      string resp = responseReader.ReadToEnd(); 
      errorLabel.Text = resp; 
     } 

    } 

    private void BeginAuthorization() 
    { 
     string CallbackUrl = Server.UrlEncode(Request.Url.AbsoluteUri); 
     var uri = new Uri(MagentoServer + "/oauth/initiate?oauth_callback=" + CallbackUrl); 

     OAuthBase oAuth = new OAuthBase(); 
     string nonce = oAuth.GenerateNonce(); 
     string timeStamp = oAuth.GenerateTimeStamp(); 
     string parameters; 
     string normalizedUrl; 
     string signature = oAuth.GenerateSignature(uri, ConsumerKey, ConsumerSecret, 
     String.Empty, String.Empty, "GET", timeStamp, nonce, OAuthBase.SignatureTypes.PLAINTEXT, 
     out normalizedUrl, out parameters); 

     StringBuilder sb = new StringBuilder("OAuth "); 
     sb.AppendFormat("oauth_callback=\"{0}\",", CallbackUrl); 
     sb.AppendFormat("oauth_version=\"{0}\",", "1.0"); 
     sb.AppendFormat("oauth_signature_method=\"{0}\",", "PLAINTEXT"); 
     sb.AppendFormat("oauth_nonce=\"{0}\",", nonce); 
     sb.AppendFormat("oauth_timestamp=\"{0}\",", timeStamp); 
     sb.AppendFormat("oauth_consumer_key=\"{0}\",", ConsumerKey); 
     sb.AppendFormat("oauth_signature=\"{0}\"", signature); 

     var request = (HttpWebRequest)WebRequest.Create(uri); 
     request.Headers[HttpRequestHeader.Authorization] = sb.ToString(); 
     request.ContentType = "text/xml"; 
     request.Accept = "text/xml"; 
     request.KeepAlive = true; 
     request.Method = "GET"; 

     try 
     { 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 

       Stream responseStream = response.GetResponseStream(); 
       StreamReader responseReader = new StreamReader(responseStream); 
       string text = responseReader.ReadToEnd(); 
       try 
       { 
        Dictionary<String, string> dic = GetDictionaryFromQueryString(text); 

        string oauth_token = dic.First(q => q.Key == "oauth_token").Value; 
        string oauth_token_secret = dic.First(q => q.Key == "oauth_token_secret").Value; 
        Session["oauth_token_secret"] = oauth_token_secret; 
        string redirectUrl = MagentoServer + "/index.php/admin/oauth_authorize?oauth_token=" + oauth_token + "&oauth_verifier=" + 
         oauth_token_secret; 
        Response.Redirect(redirectUrl); 

       } 
       catch (Exception ex) 
       { 
        errorLabel.Text = "Parsing request token failed.<br>Response text = " + text + "<br>Exception = " + ex.Message; 
       } 

      } 
     } 
     catch (WebException ex) 
     { 
      var responseStream = ex.Response.GetResponseStream(); 
      StreamReader responseReader = new StreamReader(responseStream); 
      string resp = responseReader.ReadToEnd(); 
      errorLabel.Text = resp; 
     } 
    } 

    private static Dictionary<string, string> GetDictionaryFromQueryString(string queryString) 
    { 
     string[] parts = queryString.Split('&'); 
     Dictionary<String, string> dic = new Dictionary<string, string>(); 
     foreach (var part in parts) 
     { 
      dic.Add(part.Split('=')[0], part.Split('=')[1]); 
     } 
     return dic; 
    } 

    #region Settings 

    string MagentoServer 
    { 
     get 
     { 
      return ConfigurationManager.AppSettings["Magento.Server"]; 
     } 
    } 

    string ConsumerKey 
    { 
     get 
     { 
      return ConfigurationManager.AppSettings["Magento.ConsumerKey"]; 
     } 
    } 

    string ConsumerSecret 
    { 
     get 
     { 
      return ConfigurationManager.AppSettings["Magento.ConsumerSecret"]; 
     } 
    } 

    #endregion 
} 

在类文件

public class ApiClient 
{ 

    public ApiClient(string magentoServer, string consumerKey, string consumerSecret, string accessToken, string accessTokenSeccret) 
    { 
     MagentoServer = magentoServer; 
     ConsumerKey = consumerKey; 
     ConsumerSecret = consumerSecret; 
     AccessToken = accessToken; 
     AccessTokenSecret = accessTokenSeccret; 
    } 

    #region Request 

    HttpWebRequest CreateAuthorizedRequest(string url, string requestMethod,ApiFilter filter) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "?" + filter.ToString()); 

     OAuthBase oAuth = new OAuthBase(); 
     string nonce = oAuth.GenerateNonce(); 
     string timeStamp = oAuth.GenerateTimeStamp(); 
     string parameters; 
     string normalizedUrl; 
     string signature = oAuth.GenerateSignature(new Uri(url), ConsumerKey, ConsumerSecret, 
     AccessToken, AccessTokenSecret, requestMethod, timeStamp, nonce, OAuthBase.SignatureTypes.PLAINTEXT, 
     out normalizedUrl, out parameters); 

     StringBuilder sb = new StringBuilder("OAuth "); 
     sb.AppendFormat("oauth_token=\"{0}\",", AccessToken); 
     sb.AppendFormat("oauth_version=\"{0}\",", "1.0"); 
     sb.AppendFormat("oauth_signature_method=\"{0}\",", "PLAINTEXT"); 
     sb.AppendFormat("oauth_nonce=\"{0}\",", nonce); 
     sb.AppendFormat("oauth_timestamp=\"{0}\",", timeStamp); 
     sb.AppendFormat("oauth_consumer_key=\"{0}\",", ConsumerKey); 
     sb.AppendFormat("oauth_signature=\"{0}\"", signature); 

     request.Headers[HttpRequestHeader.Authorization] = sb.ToString(); 
     request.Method = requestMethod; 

     //request.ContentType = "application/json"; 
     request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";//application/json, 
     request.KeepAlive = true; 

     return request; 
    } 

    string FetchRequest(HttpWebRequest request) 
    { 
     try 
     { 
      string responseText = string.Empty; 
      HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
      if (response.StatusCode == HttpStatusCode.OK) 
      { 
       using (Stream responseStream = response.GetResponseStream()) 
       { 
        using (StreamReader responseReader = new StreamReader(responseStream)) 
        { 
         responseText = responseReader.ReadToEnd(); 
         return responseText; 
        } 
       } 
      } 

      return responseText; 
     } 
     catch (WebException ex) 
     { 
      var responseStream = ex.Response.GetResponseStream(); 
      StreamReader responseReader = new StreamReader(responseStream); 
      string responseText = responseReader.ReadToEnd(); 
      throw new MagentoApiException(responseText,ex.Status); 
     } 
    } 

    #endregion 

    #region Public properties 

    string MagentoServer { get; set; } 

    string ConsumerKey { get; set; } 

    string ConsumerSecret { get; set; } 

    string AccessToken { get; set; } 

    string AccessTokenSecret { get; set; } 

    #endregion 

} 


public class ApiFilter 
{ 
    public ApiFilter() 
    { 
     filterDescriptions = new List<FilterDescription>(); 
    } 

    public int? Page { get; set; } 
    public int? Limit { get; set; } 
    public List<FilterDescription> filterDescriptions; 

    public const string Type = "rest"; 

    public void AddFilter(string column, FilterType filterType, string value) 
    { 
     filterDescriptions.Add(new FilterDescription() 
     { 
      Column = column, 
      FilterType = filterType, 
      Value = value 
     }); 
    } 

    public override string ToString() 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendFormat("type={0}", Type); 

     if (Page.HasValue) 
      sb.AppendFormat("&page={0}", Page.Value); 
     if (Limit.HasValue) 
      sb.AppendFormat("&limit={0}", Limit.Value); 

     int counter = 1; 
     foreach (var filter in filterDescriptions) 
     { 

      sb.AppendFormat("&filter[{0}][attribute]={1}&filter[{2}][{3}]={4}", counter, filter.Column, counter, filter.FilterType, filter.Value); 
      counter++; 
     } 

     return sb.ToString(); 
    } 
} 

public class FilterDescription 
{ 
    public string Column { get; set; } 
    public FilterType FilterType { get; set; } 
    public string Value { get; set; } 
} 

public enum FilterType 
{ 
    /// <summary> 
    /// Not Equal To 
    /// </summary> 
    neq, 
    /// <summary> 
    /// equals any of 
    /// </summary> 
    @in, 
    /// <summary> 
    /// not equals any of 
    /// </summary> 
    nin, 
    /// <summary> 
    /// greater than 
    /// </summary> 
    gt, 
    /// <summary> 
    /// less than 
    /// </summary> 
    lt 

} 

public class MagentoApiException : Exception 
{ 

    public MagentoApiException(string responseText, WebExceptionStatus status) 
    { 
     ResponseText = responseText; 
     Status = status; 
    } 

    public string ResponseText { get; set; } 
    public WebExceptionStatus Status { get; set; } 
} 

还添加以下代码不要忘记将https://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs添加到项目

它已经准备好使用。从API阅读:

var request = CreateAuthorizedRequest(MagentoServer + "/api/rest/products", "get", new ApiFilter() {Page = 1 }); 
      var responseText = FetchRequest(request); 

Magento的REST API documantion可以发现here

+0

我很欣赏你的努力Rabolf。感谢分享,我一定会尽快给它试一试,并将其标记为答案,如果按预期工作的话!再次感谢。 – 2014-07-14 06:08:08

+0

您可以分享我们的完整文件吗?因为我不会在那里放置这些代码和Im得到错误。 – Jen143 2016-04-27 02:21:03