সম্পাদনা করুন: আরও ভাল উপায় খুঁজে পেয়েছেন, নীচে সমাধান 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;
};
};
নোট করুন যে লগইন করার পরে সমস্ত পদ্ধতি প্রবেশ করে call
। method
প্যারামিটার মত কিছু 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);
}
);
});