How to use Magento REST API from C#
Asked Answered
F

4

5

Where can I find samples that show how to connect to the Magento REST API using C#?

I found was a php one which I could not figure out except a little.

Using a Dropbox OAuth sample I found on the net I tried to make it work for 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); 
}

Unfortunately this returns a BAD REQUEST response.

Fluency answered 18/7, 2012 at 5:13 Comment(6)
Did you get an anwser here? Can you share the solution? CheersPathic
I have same problem "BAD REQUEST". Did you find a solution?Tetrapody
sorry for being a bit late to respond, but I couldn't find any positive solution to do this yet. thanks.Fluency
for now, I'm gonna try what "bbaia" has suggested. @bbaia: thanks for sharing this knowledge, I'm gonna give it a try.Fluency
@sunny did you figure this out? I'm currently trying to do the same thing against the Magento REST API.Psychotherapy
@jared: oops.. I just missed this comment in my inbox... couldn't find any solution yet :(Fluency
C
7

I recently started a project for a C# REST API client for Magento that might help you out:

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

It's not yet feature complete, but the oauth authentication is implemented. The code uses restsharp which has support for oauth authentication.

Chatman answered 10/5, 2013 at 18:1 Comment(2)
it looks good and even has loads of unit tests and nuget package - Magento.RestApiSkier
Is it not maintained anymore?Eustace
D
3

I had the same question but couldn't find the answer hence I spent a day to make it work. I share my code here and I hope it will help other people in the feature.

use the following code in an aspx page to get oAuth access

        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
}

add the following code in a class file

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

also don't forget to add the https://oauth.googlecode.com/svn/code/csharp/OAuthBase.cs to the project

it's ready to use. to read from api :

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

Magento REST Api documantion can be found here

Dungdungan answered 13/7, 2014 at 10:43 Comment(3)
I appreciate your effort Rabolf. Thanks for sharing, I'll surely give it a try soon and mark it as answer if works as expected! Thanks again.Fluency
Can you share us the complete file? because I don't where will I put those codes and Im getting errors.Mcculley
This answer deserves more upvotes. Kudos for including a complete api client class.Pastose
J
0

you can quickly create a client REST API using Spring.NET Social : http://www.springframework.net/social/

Magento uses OAuth 1.0a authentication like Twitter. You can take a look to the Twitter implementation here: http://www.springframework.net/social-twitter/

And the related documentation with step by step instructions: http://www.springframework.net/social/refdoc/implementing.html

Josephinajosephine answered 18/7, 2012 at 15:17 Comment(0)
P
0

I'm not sure if this helps or not, but once I was able to get the oauth_token and oauth_token_secret from Magento (I used a PHP Magento sample to get it) I was able to query the REST API by putting everything in your requestUri into the header.

Your example helped me get most of the code correct, and just modified it a little (here's a little snippet):

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

            }

Does that help?

Psychotherapy answered 18/1, 2013 at 22:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.