জাভাস্ক্রিপ্ট সহ নেটিভ ক্লায়েন্ট থেকে ম্যাজেন্টো এপিআই কীভাবে অ্যাক্সেস করবেন


9

আমাকে স্থানীয় জাভাস্ক্রিপ্ট ভিত্তিক অ্যাপ্লিকেশন (টাইটানিয়াম ডেস্কটপ) থেকে ম্যাজেন্টো এপিআই অ্যাক্সেস করতে হবে এবং ভাবছেন যে এটি করার সর্বোত্তম উপায় কী।

আমি এ পর্যন্ত যা জানতে পেরেছি:

  • একমাত্র প্রমাণীকরণ প্রক্রিয়া OAuth, সুতরাং ব্যবহারকারীকে সাইটে তাদের শংসাপত্রগুলি প্রবেশ করতে হবে
  • একটি জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি আছে: https://code.google.com/p/oauth/source/browse/#svn%2Fcode%2Fjavascript
  • ওএথ ক্লায়েন্ট হিসাবে নেটিভ অ্যাপ্লিকেশনগুলির জন্য, ওআউথ 2 ব্যবহারকারী এজেন্ট ফ্লো বাঞ্ছনীয়।
  • পুনঃনির্দেশ URL টি কোনও স্থানীয় পৃষ্ঠায় নির্দেশ করতে হবে যেখানে থেকে টোকেনটি বের করতে হবে বা অনুলিপি করে আটকানো হবে

প্রশ্নাবলী:

  • অ্যাপ্লিকেশন কী এবং গোপনের সাথে এইচএমএসি ভিত্তিক প্রমাণীকরণের মতো কোনও কিছুর সাথে প্রমাণীকরণ প্রক্রিয়াটি বিনিময় করা কি সম্ভব? এমনকি কি প্রমাণিত সমাধান আছে?
  • যদি তা না হয় তবে মাগ্যান্তোর সাথে কি OAuth ব্যবহারকারী এজেন্ট ফ্লো সম্ভব? ডকুমেন্টেশন এটি উল্লেখ করে না।
  • ব্যবহারকারীর কাছ থেকে বেশিরভাগ অনুমোদনের প্রক্রিয়াটি আড়াল করার জন্য কি এজেএক্সের সাথে ব্যবহারকারীর শংসাপত্রগুলি জমা দেওয়া সম্ভব (ক্রস-অরিজিন-নীতি এখানে কোনও সমস্যা নয়)? অ্যাক্সেস টোকেনটি তখন সম্ভবত প্রতিক্রিয়া থেকে সরাসরি বের করা যেতে পারে।

ঠিক আছে, আমি জানতে পেরেছি যে আমি রেস্টে খুব বেশি মনোনিবেশ করেছি, এসওএপি এপিআইয়ের আমার সমস্যাটি সমাধান করা উচিত, যদিও জাভাস্ক্রিপ্ট সহ এসওএপি এক ধরণের জটিল। টাইটানিয়ামের জন্য একটি গ্রন্থাগার রয়েছে ( github.com/kWinnery/Suds ), আমি এটি চেষ্টা করে দেখতে এবং ফলাফল এখানে পোস্ট করব post
ফ্যাবিয়ান শেমংলার

উত্তর:


8

সম্পাদনা করুন: আরও ভাল উপায় খুঁজে পেয়েছেন, নীচে সমাধান 2 দেখুন

মন্তব্যে উল্লিখিত হিসাবে, এসওএপি এপিআই হবার উপায়।

সমাধান 1:

Suds আমার জন্য সামান্য পরিবর্তন ( Titanium.Network.HTTPClientপরিবর্তে এর ব্যবহার XMLHttpRequest) নিয়ে কাজ করেছে, তবে এটি কলটির জন্য একটি এসওএপি খাম তৈরি করা এবং পুরো এক্সএমএল প্রতিক্রিয়া ফিরিয়ে দেওয়ার চেয়ে বেশি কিছু নয়।

প্রুফ অফ কনসেপ্ট বাস্তবায়ন, jQuery অনুরোধ শৃঙ্খলা জন্য স্থগিত ব্যবহার করে :

Service.MagentoClient = function()
{
    var self = this;
    var suds = new SudsClient({
        endpoint : "http://the-magento-host/api/v2_soap/",
        targetNamespace : "urn:Magento",
    });

    self.login = function() {
        var deferred = new $.Deferred();
        var args = {
            username : 'the-username',
            apiKey: 'the-api-key'
        };
        suds.invoke("login", args, function(xmlDoc) {
            self.sessionId = $(xmlDoc).find("loginReturn").text();
            deferred.resolve({});
            //TODO reject if no sessionid returned
        });
        return deferred;
    };

    self.setStatus = function(orderId, status, comment, notify) {
        var deferred = new $.Deferred();
        if (!self.sessionId) {
            deferred.reject({ error: 'Login not successful.' });
            return;
        }
        var args = {
            sessionId        : self.sessionId,
            orderIncrementId : orderId,
            status           : status,
            comment          : comment,
            notify           : notify
        }
        suds.invoke("salesOrderAddComment", args, function(xmlDoc) {
            var success = $(xmlDoc).find("salesOrderAddCommentResponse").text();
            if (success) {
                deferred.resolve({});
            } else {
                deferred.reject({ error: 'Update not successful.' });
            }

        });
        return deferred;
    };
};

ব্যবহারের উদাহরণ:

        var magento = new Service.MagentoClient();
        magento.login().then(function() {
            magento.setStatus('100000029', 'complete', 'soap test');
        }).then(function() {
            alert('Update successful');
        }, function(reject) {
            alert('Update failed: ' + reject.error);
        });

সমাধান 2:

দেখা গেল যে একটি নিজস্ব এপিআই অ্যাডাপ্টার লেখা সত্যিই সহজ হতে পারে। এর উদাহরণ সহএই কোর-হ্যাক(মৃত লিঙ্ক) এর উপর ভিত্তি করে আমি JSON-RPC অ্যাডাপ্টারের জন্য একটি পরিষ্কার মডিউল লিখতে সক্ষম হয়েছি Zend_Json_Server। এটি SOAP এবং XML-RPC API হিসাবে একই প্রমাণীকরণ এবং এসিএল ব্যবহার করে।

প্রবেশের স্থানটি ব্যবহার করতে /api/jsonrpc, নতুন নিয়ামকটি apiরুটে যুক্ত করতে হবে :

<config>
    <frontend>
        <routers>
            <api>
                <args>
                    <modules>
                        <my_jsonrpc before="Mage_Api">My_JsonRpc_Api</my_jsonrpc>
                    </modules>
                </args>
            </api>
        </routers>
    </frontend>
</config>

আপডেট ০২/২০১৫: উপরের লিঙ্কটি এখন মারা গেছে, সুতরাং আমি আমার JSON-RPC অ্যাডাপ্টারটিকে সম্পূর্ণ এক্সটেনশান হিসাবে খুলি: https://github.com/sgh-it/jsonrpc

আমার জেএস ক্লায়েন্টটি এখন এর মতো দেখতে (আবার জিকুয়েরি.ডেফার্ডের সাথে, তবে এপিআই-র জন্য কোনও অতিরিক্ত 3 য় পক্ষের গ্রন্থাগার নেই):

/**
 * Client for the Magento API
 */
Service.MagentoClient = function()
{
    var self = this;

    /**
     * @param string   method    the remote procedure to call
     * @param object   params    parameters for the RPC
     * @param callback onSuccess callback for successful request. Expects one parameter (decoded response object)
     * @param callback onError   callback for failed request. Expects one parameter (error message)
     * 
     * @return void
     */
    self.jsonRpc = function(method, params, onSuccess, onError) {
        var request = {
            method : method,
            params : params,
            jsonrpc : "2.0",
            id : 1
        };

        var options = {
            entryPoint : config.magentoClient.entryPoint,
            method: 'post',
            timeout: config.magentoClient.timeout
        };

        var httpClient = Titanium.Network.createHTTPClient();
        httpClient.onload = function(e) {
            try {
                var response = JSON.parse(this.responseText);
            } catch (jsonError) {
                return onError(jsonError);
            }
            if (response.error) {
                if (response.error.code == 5) { // session expired
                    self.sessionId = null;
                }
                return onError(response.error.message);
            }
            onSuccess(response);
        };
        httpClient.onerror = function(e) {
            onError(e.error + '; Response:' + this.responseText);
        };
        httpClient.setTimeout(options.timeout);

        if (httpClient.open(options.method, options.entryPoint)) {
            httpClient.setRequestHeader("Content-type", "application/json");
            httpClient.send(JSON.stringify(request));
        } else {
            onError('cannot open connection');
        }

    }
    /**
     * Retrieve session id for API
     * 
     * @return JQuery.Deferred deferred object for asynchronous chaining
     */
    self.login = function() {
        var deferred = new $.Deferred();
        if (self.sessionId) {
            deferred.resolve();
            return deferred;
        }
        var loginParams = config.magentoClient.login;
        try {
            self.jsonRpc('login', loginParams, function(response) {
                if (response && response.result) {
                    self.sessionId = response.result;
                    deferred.resolve();
                } else {
                    deferred.reject('Login failed.');
                }
            }, function(error) {
                deferred.reject(error);
            });
        } catch (rpcError) {
            deferred.reject(rpcError);
        }
        return deferred;
    };
    /**
     * Updates order states in Magento
     *
     * @param string method   name of the remote method
     * @param object args     arguments for the remote method
     * 
     * @return JQuery.Deferred deferred object for asynchronous chaining
     */
    self.call = function(method, args) {
        var deferred = new $.Deferred();
        if (!self.sessionId) {
            deferred.reject('No session.');
            return;
        }
        var callParams = {
            sessionId : self.sessionId,
            apiPath   : method,
            args      : args
        };
        try {
            self.jsonRpc('call', callParams, function(response) {
                deferred.resolve(response.result);
            }, function(error) {
                deferred.reject(error);
            });
        } catch (rpcError) {
            deferred.reject(rpcError);
        }

        return deferred;
    };
};

নোট করুন যে লগইন করার পরে সমস্ত পদ্ধতি প্রবেশ করে callmethodপ্যারামিটার মত কিছু sales_order.list, argsপরামিতি একটি অ্যারের বা পদ্ধতি আর্গুমেন্ট সহ বস্তু।

ব্যবহারের উদাহরণ:

        var filters = [];
        var magento = new Service.MagentoClient();
        magento.login().then(function() {
            magento.call('sales_order.list', [filters]).then(
                function(orders) {
                    // do something with the response
                }, function(error) {
                    alert('Magento API error: ' + error);
                }
            );
        });

আপনার স্ক্রিপ্টের এন্ডপয়েন্টটি কীভাবে কনফিগার করবেন?
আকরামো

আপনাকে সামনের রাউটারের সংজ্ঞাটি পরিবর্তন করতে হবে config.xml(আপনি যদি এই apiরুটটি ব্যবহার করতে না চান তবে পরিবর্তে আপনি একটি কাস্টম রুটও ব্যবহার করতে পারেন, অন্য কোনও ম্যাজেন্টো মডিউলে যেমন করেন ঠিক তেমন সংজ্ঞা দিন
ফ্যাবিয়ান শেমংলার

যেখানে আমি এই কোডটি ম্যাজেন্টোতে রাখতে পারি
er.irfankhan11

ইনস্টলেশন নির্দেশাবলী সেখানে রয়েছে: github.com/sgh-it/jsonrpc
ফ্যাবিয়ান শেমংলার

এবং জাভাস্ক্রিপ্ট কোড অবশ্যই ম্যাজেন্টোর অন্তর্গত নয় তবে বাহ্যিক ক্লায়েন্টের সাথে
ফ্যাবিয়ান শেমংলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.