জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করা (v2.0)

সতর্কতা : এই পৃষ্ঠাটি Google-এর পুরানো API, Google Data APIs সম্পর্কে; এটি শুধুমাত্র Google Data APIs ডিরেক্টরিতে তালিকাভুক্ত APIগুলির সাথে প্রাসঙ্গিক, যার মধ্যে অনেকগুলি নতুন API দিয়ে প্রতিস্থাপিত হয়েছে৷ একটি নির্দিষ্ট নতুন API সম্পর্কে তথ্যের জন্য, নতুন API এর ডকুমেন্টেশন দেখুন। একটি নতুন API-এর সাহায্যে অনুরোধ অনুমোদনের বিষয়ে তথ্যের জন্য, Google অ্যাকাউন্ট প্রমাণীকরণ এবং অনুমোদন দেখুন।

এই ডকুমেন্টটি বর্ণনা করে কিভাবে জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করে Google Data API ক্যোয়ারী পাঠাতে হয় এবং প্রত্যাবর্তিত প্রতিক্রিয়া ব্যাখ্যা করে।

ডেটা API আছে এমন পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করার জন্য Google বিভিন্ন প্রোগ্রামিং ভাষায় ক্লায়েন্ট লাইব্রেরির একটি সেট সরবরাহ করে। এই লাইব্রেরিগুলি ব্যবহার করে, আপনি API অনুরোধগুলি তৈরি করতে, সেগুলিকে একটি পরিষেবাতে পাঠাতে এবং প্রতিক্রিয়া পেতে পারেন৷

এই নথিটি জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করার বিষয়ে কিছু সাধারণ তথ্য প্রদান করে, সাথে সাধারণ ব্যবহারের উদাহরণগুলির একটি সেট।

শ্রোতা

এই নথিটি জাভাস্ক্রিপ্ট প্রোগ্রামারদের উদ্দেশ্যে যারা ক্লায়েন্ট অ্যাপ্লিকেশন লিখতে চান যা Google ডেটা পরিষেবাগুলির সাথে ইন্টারঅ্যাক্ট করতে পারে৷

এই নথিটি অনুমান করে যে আপনি Google Data APIs প্রোটোকলের পিছনে সাধারণ ধারণাগুলি বোঝেন। এটি অনুমান করে যে আপনি জাভাস্ক্রিপ্টে কীভাবে প্রোগ্রাম করতে হয় তা জানেন।

ক্লায়েন্ট লাইব্রেরি দ্বারা প্রদত্ত ক্লাস এবং পদ্ধতি সম্পর্কে তথ্যের জন্য, JavaScript ক্লায়েন্ট লাইব্রেরি API রেফারেন্স দেখুন (JSdoc ফর্ম্যাটে)।

এই নথিটি ক্রমানুসারে পড়ার জন্য ডিজাইন করা হয়েছে; প্রতিটি উদাহরণ আগের উদাহরণের উপর তৈরি করে।

ব্যবহারের শর্তাবলী

আপনি JavaScript ক্লায়েন্ট লাইব্রেরি ব্যবহার করার সময় Google JavaScript ক্লায়েন্ট লাইব্রেরির ব্যবহারের শর্তাবলী মেনে চলতে সম্মত হন।

ডেটা মডেল এবং নিয়ন্ত্রণ প্রবাহ ওভারভিউ

JavaScript ক্লায়েন্ট লাইব্রেরি Google Data APIs দ্বারা ব্যবহৃত উপাদানগুলিকে উপস্থাপন করতে ক্লাসের একটি সেট ব্যবহার করে।

দ্রষ্টব্য : ডেটার অন্তর্নিহিত উপস্থাপনা হল JSON, কিন্তু ক্লায়েন্ট লাইব্রেরি একটি বিমূর্ত স্তর প্রদান করে যাতে আপনাকে সরাসরি JSON ডেটার সাথে কাজ করতে হবে না। আপনি যদি ক্লায়েন্ট লাইব্রেরি ছাড়া JSON-এর সাথে সরাসরি কাজ করতে চান, তাহলে Google Data API-এর সাথে JSON ব্যবহার দেখুন।

লাইব্রেরি এমন পদ্ধতিগুলি সরবরাহ করে যা আপনাকে অসিঙ্ক্রোনাসভাবে ডেটা পাঠাতে এবং একটি ডেটা API আছে এমন একটি পরিষেবা থেকে ডেটা গ্রহণ করতে দেয়। উদাহরণস্বরূপ, google.gdata.calendar.CalendarService.getEventsFeed() পদ্ধতিটি Google ক্যালেন্ডারে একটি ফিডের জন্য একটি অনুরোধ পাঠায়। আপনি পাস করা প্যারামিটারগুলির মধ্যে একটি হল একটি ধারাবাহিক ফাংশন, এটি একটি কলব্যাক নামেও পরিচিত; পরিষেবাটি কন্টিনিউয়েশন ফাংশন কল করে JSON ফর্ম্যাটে ফিড ফেরত দেয়। তারপরে ক্লায়েন্ট জাভাস্ক্রিপ্ট অবজেক্টের আকারে ডেটা ব্যবহার করার জন্য বিভিন্ন get কল করতে পারে।

একটি নতুন এন্ট্রি যোগ করতে, আপনি ক্লায়েন্ট লাইব্রেরির ক্লাস এবং পদ্ধতি ব্যবহার করে এন্ট্রি তৈরি করুন, তারপর পরিষেবাতে নতুন এন্ট্রি পাঠাতে feed.insertEntry() পদ্ধতিতে কল করুন। আবার আপনি একটি ধারাবাহিকতা ফাংশন প্রদান করেন, যা এন্ট্রি সফলভাবে যোগ করা হলে পরিষেবাটি কল করে।

আপনি জাভাস্ক্রিপ্টে নতুন হলে, নিয়ন্ত্রণ প্রবাহ একটু বিভ্রান্তিকর হতে পারে। getEventsFeed() বা insertEntry() এর মত একটি পদ্ধতি কল করার পরে, বেশিরভাগ ক্ষেত্রে আপনার স্ক্রিপ্ট শেষ হয়ে যায়। যখন পরিষেবা অনুরোধকৃত ডেটা ফেরত দেয় তখন ধারাবাহিকতা ফাংশনে এক্সিকিউশন পুনরায় শুরু হয়। অতএব, আপনার ক্লায়েন্ট প্রত্যাবর্তিত ডেটাতে যা করে তা ধারাবাহিকতা ফাংশনে করা উচিত, বা সেই ফাংশন থেকে কল করা উচিত। একাধিক ফাংশনে ব্যবহার করার জন্য আপনাকে কিছু ভেরিয়েবলকে বিশ্বব্যাপী তৈরি করতে হতে পারে।

এই প্রোগ্রামিং শৈলী সম্পর্কে আরও তথ্যের জন্য, উইকিপিডিয়ায় " ধারাবাহিকতা-পাসিং শৈলী " দেখুন।

সমর্থিত পরিবেশ সম্পর্কে

বর্তমানে, আমরা শুধুমাত্র জাভাস্ক্রিপ্ট ক্লায়েন্ট অ্যাপ্লিকেশনগুলিকে সমর্থন করি যেগুলি ব্রাউজারে একটি ওয়েব পৃষ্ঠায় চলে৷ বর্তমানে সমর্থিত ব্রাউজারগুলি হল:

  • ফায়ারফক্স 2.x এবং 3.x
  • ইন্টারনেট এক্সপ্লোরার 6, 7, এবং 8
  • সাফারি 3.x এবং 4.x
  • গুগল ক্রোম (সমস্ত সংস্করণ)

জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি পরিষেবার সার্ভারের সাথে সমস্ত যোগাযোগ পরিচালনা করে। আপনি যদি একজন অভিজ্ঞ JS ডেভেলপার হন, তাহলে আপনি হয়তো ভাবছেন, "কিন্তু একই মূল নীতির কী হবে?" JavaScript ক্লায়েন্ট লাইব্রেরি আপনার ক্লায়েন্টকে ব্রাউজার নিরাপত্তা মডেলের সাথে সঙ্গতিপূর্ণ থাকাকালীন যেকোনো ডোমেন থেকে Google ডেটা অনুরোধ পাঠাতে দেয়।

Google Data API-এর সাথে প্রমাণীকরণের একটি ওভারভিউয়ের জন্য, Google Data APIs প্রমাণীকরণ ওভারভিউ দেখুন। এই নথির বাকি অংশটি অনুমান করে যে আপনি এই সিস্টেমটি কীভাবে কাজ করে তার মূল বিষয়গুলির সাথে পরিচিত৷

নমুনা ক্লায়েন্ট অ্যাপ্লিকেশন

জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি কার্যকর দেখতে, আমাদের নমুনা পৃষ্ঠা দেখুন।

টিউটোরিয়াল এবং উদাহরণ

নিম্নলিখিত উদাহরণগুলি দেখায় কিভাবে জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করে বিভিন্ন ডেটা API অনুরোধ পাঠাতে হয়।

এগুলিকে আরও কংক্রিট করতে, এই উদাহরণগুলি দেখায় যে কীভাবে একটি নির্দিষ্ট পরিষেবার সাথে ইন্টারঅ্যাক্ট করতে হয়: Google ক্যালেন্ডার৷ অন্যান্য পরিষেবাগুলির সাথে ব্যবহারের জন্য এই উদাহরণগুলিকে মানিয়ে নিতে আপনাকে সাহায্য করার জন্য আমরা সেই স্থানগুলিকে নির্দেশ করব যেখানে ক্যালেন্ডার অন্যান্য Google পরিষেবাগুলির থেকে আলাদা৷ ক্যালেন্ডার সম্পর্কে আরও তথ্যের জন্য, Google ক্যালেন্ডার ডেটা API নথি দেখুন।

লাইব্রেরি লোড হচ্ছে

আপনার ক্লায়েন্ট ক্লায়েন্ট লাইব্রেরি ব্যবহার করার আগে, ক্লায়েন্টকে সার্ভার থেকে ক্লায়েন্ট লাইব্রেরি কোড অনুরোধ করতে হবে।

Google AJAX API লোডার আনতে আপনার HTML নথির <head> বিভাগে একটি <script> ট্যাগ ব্যবহার করে শুরু করুন:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>

আপনি Google এর সার্ভারে রাউন্ডট্রিপ কমিয়ে আনতে পারেন এবং লাইব্রেরি প্রিলোড করে লেটেন্সি কমাতে পারেন। Google AJAX API লোডার থেকে সরাসরি কিছু প্যাকেজ প্রিলোড করতে ( google.load() ব্যবহার না করে নিচে দেখুন), নিম্নলিখিতগুলি ব্যবহার করুন:

<script type="text/javascript"
      src="https://www.google.com/jsapi?autoload=%7Bmodules%3A%5B%7Bname%3Agdata%2Cversion%3A2.x%2Cpackages%3A%5Bblogger%2Ccontacts%5D%7D%5D%7D"></script>

দ্রষ্টব্য : স্ক্রিপ্টের src URL সম্পূর্ণরূপে urlencoded হওয়া উচিত। যেমন, আগের উদাহরণ হল
<script type="text/javascript" src="https://www.google.com/jsapi?autoload={modules:[{name:gdata,version:2.x,packages:[blogger,contacts]}]}"></script>

আপনি যদি মডিউলগুলি স্বয়ংক্রিয়ভাবে লোড না করেন, তাহলে সাধারণ লোডার আনার পরে আপনি আপনার জাভাস্ক্রিপ্ট সেটআপ কোডের পরবর্তী উদাহরণ ব্যবহার করে Google ডেটা ক্লায়েন্ট লাইব্রেরি লোড করতে পারেন। এই কলটি অবশ্যই আপনার HTML ডকুমেন্টের <head> বিভাগ থেকে করতে হবে (বা আপনার HTML ডকুমেন্টের <head> বিভাগে একটি <script> ট্যাগ ব্যবহার করে অন্তর্ভুক্ত একটি JavaScript ফাইল থেকে):

google.load("gdata", "2");

বিকল্পভাবে, আপনি সম্পূর্ণ লাইব্রেরির পরিবর্তে নির্দিষ্ট পরিষেবার জন্য অনুরোধ করতে পারেন। এই উদাহরণটি শুধুমাত্র ব্লগার এবং পরিচিতিগুলির জন্য প্যাকেজগুলি ডাউনলোড করে:

google.load("gdata", "2.x", {packages: ["blogger", "contacts"]});

google.load() এর দ্বিতীয় প্যারামিটারটি হল JavaScript ক্লায়েন্ট লাইব্রেরির অনুরোধকৃত সংস্করণ নম্বর। আমাদের সংস্করণ নম্বরিং স্কিমটি Google Maps API দ্বারা ব্যবহৃত একটির অনুকরণে তৈরি করা হয়েছে৷ এখানে সম্ভাব্য সংস্করণ সংখ্যা এবং তাদের অর্থ কী:

"1"
প্রধান সংস্করণ 1 এর দ্বিতীয় থেকে শেষ সংশোধন।
"1.x"
প্রধান সংস্করণ 1 এর একেবারে সর্বশেষ সংশোধন।
"1.s"
প্রধান সংস্করণ 1 এর সর্বশেষ স্থিতিশীল সংশোধন। আমরা মাঝে মাঝে ক্লায়েন্ট লাইব্রেরির একটি নির্দিষ্ট সংস্করণকে ডেভেলপারদের কাছ থেকে প্রাপ্ত প্রতিক্রিয়ার ভিত্তিতে "স্থিতিশীল" হিসাবে ঘোষণা করব। যাইহোক, সেই সংস্করণে সর্বশেষ বৈশিষ্ট্য নাও থাকতে পারে।
"1.0" , "1.1 ", ইত্যাদি
লাইব্রেরির একটি নির্দিষ্ট সংস্করণ, একটি নির্দিষ্ট প্রধান এবং ছোট সংশোধন নম্বর সহ।

আপনি google.load() কল করার পরে, আপনাকে লোডারকে পৃষ্ঠাটি লোড হওয়া পর্যন্ত অপেক্ষা করতে বলতে হবে এবং তারপরে আপনার কোডটি কল করতে হবে:

google.setOnLoadCallback(getMyFeed);

যেখানে getMyFeed() এই নথির পরবর্তী বিভাগে সংজ্ঞায়িত একটি ফাংশন। <body> উপাদানের সাথে একটি onload হ্যান্ডলার সংযুক্ত করার পরিবর্তে এই পদ্ধতিটি ব্যবহার করুন।

একটি অননুমোদিত ফিড অনুরোধ

একটি অননুমোদিত ফিডের জন্য অনুরোধ করতে, আপনার JavaScript ফাইলে, অথবা আপনার HTML ফাইলের একটি <script> ট্যাগে নিম্নলিখিত কোডটি যোগ করুন।

নিম্নলিখিত কোডে, getMyFeed() প্রথমে ডাকা হয়েছে (AJAX API লোডার দ্বারা, যেমনটি পূর্ববর্তী বিভাগে বর্ণিত হয়েছে)।

এটি Google ক্যালেন্ডারে একটি সংযোগ (একটি ক্যালেন্ডারসার্ভিস অবজেক্ট দ্বারা উপস্থাপিত) তৈরি করতে setupMyService() কল করে৷ আমরা মডুলারিটির জন্য একটি পৃথক ফাংশনে পরিষেবা তৈরির কোডটি টেনে নিয়েছি; পরে, আমরা আপনার প্রমাণীকরণ পছন্দের উপর নির্ভর করে setupMyService() ফাংশন পরিবর্তন করব।

পরিষেবা সেট আপ করার পরে, getMyFeed() ফিডের অনুরোধ করার জন্য ক্লায়েন্ট লাইব্রেরির getEventsFeed() পদ্ধতিতে কল করে।

আমরা একটি গ্লোবাল ভেরিয়েবলে ফিড URL নির্দিষ্ট করছি যাতে এটি পরবর্তী ফাংশনে ব্যবহার করা যায়। এই উদাহরণে, আমরা liz@gmail.com নামের একজন ব্যবহারকারীর জন্য সর্বজনীন (অপ্রমাণিত) ফিড ইউআরএল ব্যবহার করছি আপনি প্রমাণীকৃত ব্যবহারকারীর প্রতিনিধিত্ব করতে ব্যবহারকারীর ইমেল ঠিকানার জায়গায় default ব্যবহার করতে পারেন।

var feedUrl = "http://www.google.com/calendar/feeds/liz@gmail.com/public/full";

function setupMyService() {
  var myService = new google.gdata.calendar.CalendarService('exampleCo-exampleApp-1');
  return myService;
}

function getMyFeed() {
  myService = setupMyService();

  myService.getEventsFeed(feedUrl, handleMyFeed, handleError);
}

নোট করুন যে আমরা myService একটি গ্লোবাল ভেরিয়েবল বানাচ্ছি, পরবর্তী ফাংশনগুলিতে ব্যবহার সহজ করার জন্য।

উপরের কোডটি আপনার নিজের ক্লায়েন্টে কাজ করার জন্য, আপনাকে একটি প্রকৃত ব্যবহারকারীর ইমেল ঠিকানা ব্যবহার করতে হবে, একটি ক্যালেন্ডার অ্যাকাউন্টের জন্য একটি সর্বজনীনভাবে ভাগ করা ক্যালেন্ডারের সাথে৷

দ্রষ্টব্য : আপনি যখন একটি নতুন CalendarService অবজেক্ট তৈরি করেন, তখন ক্লায়েন্ট লাইব্রেরি google.gdata.client.init() নামে একটি পদ্ধতি কল করে, যা পরীক্ষা করে যে ক্লায়েন্টটি যে ব্রাউজারে চলছে সেটি সমর্থিত কিনা। যদি কোনো ত্রুটি থাকে, তাহলে ক্লায়েন্ট লাইব্রেরি ব্যবহারকারীকে একটি ত্রুটি বার্তা প্রদর্শন করে। আপনি যদি এই ধরণের ত্রুটি নিজে পরিচালনা করতে চান, তাহলে পরিষেবাটি তৈরি করার আগে আপনি স্পষ্টভাবে google.gdata.client.init(handleInitError) কল করতে পারেন, যেখানে handleInitError() আপনার কাজ। যদি একটি init ত্রুটি দেখা দেয়, তাহলে আপনার ফাংশন একটি মানক ত্রুটি অবজেক্ট পায়; আপনি যে বস্তুর সাথে যা খুশি করতে পারেন।

getEventsFeed() কলে, দ্বিতীয় আর্গুমেন্ট হল handleMyFeed , যা একটি কলব্যাক ফাংশন; নিচে দেখ. Google ক্যালেন্ডার অনুরোধটি প্রক্রিয়া করে এবং তারপরে, অনুরোধটি সফল হলে, অনুরোধ করা ফিড ধারণকারী একটি "ফিড রুট" অবজেক্ট কলব্যাকে পাস করে। একটি ফিড রুট হল একটি ধারক বস্তু যাতে একটি ফিড থাকে।

getEventsFeed() এর তৃতীয় আর্গুমেন্ট হল একটি ঐচ্ছিক ত্রুটি-হ্যান্ডলিং ফাংশন; যদি ক্লায়েন্ট লাইব্রেরি একটি ত্রুটির সম্মুখীন হয়, এটি সফল কলব্যাক ফাংশনের পরিবর্তে নির্দিষ্ট ত্রুটি হ্যান্ডলারকে কল করে। ক্লায়েন্ট লাইব্রেরি যে বস্তুটি ত্রুটি হ্যান্ডলারের কাছে আর্গুমেন্ট হিসাবে পাস করে সেটি হল JavaScript Error অবজেক্টের একটি উদাহরণ, একটি অতিরিক্ত cause বৈশিষ্ট্য সহ।

এখানে কলব্যাক ফাংশন এবং ত্রুটি-হ্যান্ডলারের সহজ সংস্করণ রয়েছে:

function handleMyFeed(myResultsFeedRoot) {
  alert("This feed's title is: " + myResultsFeedRoot.feed.getTitle().getText());
}

function handleError(e) {
  alert("There was an error!");
  alert(e.cause ? e.cause.statusText : e.message);
}

আমরা কেবল ব্যবহারকারীর কাছে সেগুলি প্রদর্শন করে ত্রুটিগুলি পরিচালনা করছি; আপনার ক্লায়েন্ট এর ত্রুটি হ্যান্ডলার সম্ভবত আরো পরিশীলিত হওয়া উচিত. কিছু প্রসঙ্গে, কোনো কারণ নির্দিষ্ট নাও থাকতে পারে, তাই এই ক্ষেত্রে আমাদের উদাহরণ ত্রুটি হ্যান্ডলার স্ট্যান্ডার্ড message বৈশিষ্ট্য প্রদর্শন করতে ফিরে আসে।

মনে রাখবেন যেহেতু এই কোডটি প্রমাণীকরণ করে না, আপনি এটি শুধুমাত্র একটি পাবলিক ফিড পেতে ব্যবহার করতে পারেন।

প্রমাণীকরণ

জাভাস্ক্রিপ্ট ক্লায়েন্ট লাইব্রেরি দুটি মোডে ব্যবহার করা যেতে পারে। আপনি যদি একটি গ্যাজেট লিখছেন, তাহলে এটি প্রমাণীকরণের জন্য OAuth প্রক্সি নামে একটি বৈশিষ্ট্য ব্যবহার করে৷ যদি এটি একটি স্বতন্ত্র জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন থেকে অ্যাক্সেস করা হয় তবে এটি AuthSub প্রমাণীকরণ সিস্টেম ব্যবহার করে। প্রমাণীকরণ সম্পর্কে তথ্যের জন্য, Google Data APIs প্রমাণীকরণ ওভারভিউ ডকুমেন্ট দেখুন। এই বিভাগের বাকি অংশটি অনুমান করে যে আপনি এই সিস্টেমটি কীভাবে কাজ করে তার মূল বিষয়গুলির সাথে পরিচিত।

এই নথিতে প্রদত্ত নমুনা কোডের সাথে প্রমাণীকরণ ব্যবহার করার আগে, ফিড ইউআরএলটি সর্বজনীন থেকে ব্যক্তিগততে পরিবর্তন করুন:

var feedUrl = "http://www.google.com/calendar/feeds/liz@gmail.com/private/full";

AuthSub-এর সাথে একটি ওয়েব ক্লায়েন্টে প্রমাণীকরণ করা

Google এর "AuthSub for JavaScript" অনুমোদন ব্যবস্থা আর উপলব্ধ নেই৷

পরিবর্তে, আমরা ক্লায়েন্ট-সাইড অ্যাপ্লিকেশনগুলির জন্য OAuth 2.0 ব্যবহার করার পরামর্শ দিই৷

OAuth প্রক্সি দিয়ে একটি গ্যাজেটে প্রমাণীকরণ করা হচ্ছে

একটি গ্যাজেটের জন্য প্রমাণীকরণ প্রক্রিয়া চলাকালীন কী ঘটে তার একটি সংক্ষিপ্ত বিবরণ এখানে রয়েছে:

  1. আপনার গ্যাজেটটি প্রথমবার লোড হয় এবং Google ডেটা APIগুলির একটি ব্যবহার করে ব্যবহারকারীর ডেটা অ্যাক্সেস করার চেষ্টা করে৷
  2. অনুরোধটি ব্যর্থ হয়েছে কারণ ব্যবহারকারী এখনও তাদের ডেটাতে অ্যাক্সেস দেয়নি। প্রতিক্রিয়া অবজেক্টে OAuth অনুমোদন পৃষ্ঠার জন্য একটি URL ( response.oauthApprovalUrl এ) রয়েছে। আপনার গ্যাজেটটিকে সেই URL সহ একটি নতুন উইন্ডো চালু করার জন্য একটি পদ্ধতি প্রদান করা উচিত৷
  3. অনুমোদন পৃষ্ঠায়, ব্যবহারকারী আপনার গ্যাজেটে অ্যাক্সেস মঞ্জুর/অস্বীকার করতে বেছে নেয়। সফল হলে, ব্যবহারকারীকে আপনার নির্দিষ্ট করা oauth_callback পৃষ্ঠায় নিয়ে যাওয়া হবে। সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতার জন্য, http://oauth.gmodules.com/gadgets/oauthcallback ব্যবহার করুন।
  4. এর পরে, ব্যবহারকারী পপআপ উইন্ডোটি বন্ধ করে দেয়। আপনার গ্যাজেটটিকে ব্যবহারকারী অনুমোদন দিয়েছে তা জানাতে সাহায্য করার জন্য, আমরা একটি পপআপ হ্যান্ডলার প্রদান করেছি যা আপনি অনুমোদন উইন্ডো বন্ধ শনাক্ত করতে ব্যবহার করতে পারেন৷ বিকল্পভাবে, আপনার গ্যাজেটটি একটি লিঙ্ক প্রদর্শন করতে পারে (যেমন " আমি অ্যাক্সেস অনুমোদন করেছি ") ব্যবহারকারীর জন্য এই উইন্ডোটি বন্ধ হওয়ার পরে ম্যানুয়ালি ক্লিক করতে।
  5. আপনার গ্যাজেট ব্যবহারকারীর ডেটা পুনরায় অনুরোধ করে দ্বিতীয়বার Google ডেটা API অ্যাক্সেস করার চেষ্টা করে৷ এই প্রচেষ্টা সফল হয়।
  6. আপনার গ্যাজেটটি প্রমাণীকৃত এবং স্বাভাবিকভাবে কাজ করা শুরু করতে পারে।

আপনার গ্যাজেটে, <ModulePrefs> বিভাগে একটি <OAuth> উপাদান যোগ করুন:

<ModulePrefs>
...
<OAuth>
  <Service name="google">
    <Access url="https://www.google.com/accounts/OAuthGetAccessToken" method="GET" /> 
    <Request url="https://www.google.com/accounts/OAuthGetRequestToken?
                  scope=http://www.blogger.com/feeds/%20http://www.google.com/calendar/feeds/" method="GET" /> 
    <Authorization url="https://www.google.com/accounts/OAuthAuthorizeToken?
                        oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback" /> 
  </Service>
</OAuth>
...
</ModulePrefs>

এই বিভাগে, নিম্নলিখিত ক্যোয়ারী পরামিতি পরিবর্তন করুন:

  • scope

    অনুরোধ URL-এ একটি প্রয়োজনীয় প্যারামিটার। আপনার গ্যাজেট শুধুমাত্র এই প্যারামিটারে ব্যবহৃত scope (গুলি) থেকে ডেটা অ্যাক্সেস করতে সক্ষম হবে৷ এই উদাহরণে, গ্যাজেটটি আপনার ব্লগার এবং ক্যালেন্ডার ডেটা অ্যাক্সেস করবে৷ একটি গ্যাজেট একটি একক সুযোগ বা একাধিক স্কোপের জন্য ডেটা অনুরোধ করতে পারে (যেমন এই উদাহরণটি করে)।

  • oauth_callback

    অনুমোদন URL-এ একটি ঐচ্ছিক পরামিতি। ব্যবহারকারী তাদের ডেটাতে অ্যাক্সেস অনুমোদন করার পরে OAuth অনুমোদন পৃষ্ঠাটি এই URL-এ পুনঃনির্দেশিত হবে। আপনি এই প্যারামিটারটি ছেড়ে দিতে, এটিকে আপনার নিজের "অনুমোদিত পৃষ্ঠাতে" সেট করতে বা পছন্দ করে, http://oauth.gmodules.com/gadgets/oauthcallback ব্যবহার করতে পারেন। ব্যবহারকারীরা যখন প্রথমবার আপনার গ্যাজেট ইনস্টল করে তখন পরেরটি সেরা ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। সেই পৃষ্ঠাটি জাভাস্ক্রিপ্টের একটি স্নিপেট প্রদান করে যা স্বয়ংক্রিয়ভাবে পপআপ উইন্ডোটি বন্ধ করে দেয়।

এরপর, আপনার গ্যাজেটের <Content> বিভাগে Javascript ক্লায়েন্ট লাইব্রেরি লোড করুন। পরিষেবা অবজেক্টের useOAuth() পদ্ধতিতে কল করতে পূর্ববর্তী উদাহরণগুলি থেকে setupMyService() ফাংশনটি পরিবর্তন করুন। এটি গ্যাজেটটিকে AuthSub এর পরিবর্তে প্রমাণীকরণের জন্য OAuth প্রক্সি ব্যবহার করতে বলে৷ নীচের এই টেমপ্লেটটি আপনাকে শুরু করা উচিত:

<Content type="html">
<![CDATA[
  ...
  <script src="https://www.google.com/jsapi"></script>
  <script type="text/javascript">
    var myService = null;
    
    function setupMyService() {
      myService = new google.gdata.calendar.CalendarService('exampleCo-exampleApp-1');
      myService.useOAuth('google');
      fetchData();
    }
    
    function initGadget() {
      google.load('gdata', '2.x');
      google.setOnLoadCallback(setupMyService);
    }

    function fetchData() {            
      var callback = function(response) {
        if (response.oauthApprovalUrl) {
        
          // TODO: Display "Sign in" link (response.oauthApprovalUrl contains the URL) 
          
        } else if (response.feed) {
        
          // TODO: show results
          
        } else {
        
          // TODO: handle the error
          
        }
      };

      myService.getEventsFeed('http://www.google.com/calendar/feeds/default/public/full', callback, callback);
    }
    
    gadgets.util.registerOnLoadHandler(initGadget);
  </script>
  ...
]]> 
</Content>

লক্ষ্য করুন যে google.accounts.user.login(scope) এ কলটি সরানো হয়েছে। প্রক্সি আপনার জন্য প্রমাণীকরণ পরিচালনা করে।

Google Data API গ্যাজেট লেখার বিষয়ে আরও তথ্যের জন্য, fetchData() কী থাকা উচিত তার বিশদ বিবরণ সহ, একটি Google ডেটা গ্যাজেট তৈরি করার বিষয়ে আমাদের নিবন্ধটি দেখুন বা সম্পূর্ণ লেখার OAuth গ্যাজেট ডকুমেন্টেশন দেখুন।

একটি নতুন আইটেম সন্নিবেশ করা হচ্ছে

একটি নতুন ক্যালেন্ডার ইভেন্ট তৈরি করতে, একটি নতুন ফাংশন কল করার জন্য handleMyFeed() ফাংশনের শেষ পরিবর্তন করে আগের উদাহরণ থেকে সম্পাদন চালিয়ে যান:

function handleMyFeed(myResultsFeedRoot) {
  alert("This feed's title is: " + myResultsFeedRoot.feed.getTitle().getText());
  insertIntoMyFeed(myResultsFeedRoot);
}

নতুন ফাংশনে, নতুন এন্ট্রি তৈরি করতে প্রথমে CalendarEventEntry কনস্ট্রাক্টর ব্যবহার করুন। তারপর এন্ট্রি সন্নিবেশ করান, সন্নিবেশ করা হয়ে গেলে পরিষেবা কল করার জন্য একটি কলব্যাক প্রদান করে।

function insertIntoMyFeed(feedRoot) {
  var newEntry = new google.gdata.calendar.CalendarEventEntry({
      authors: [{
        name: "Elizabeth Bennet",
        email: "liz@gmail.com"
      }],
      title: {
        type: 'text', 
        text: 'Tennis with Darcy'
      },
      content: {
        type: 'text', 
        text: 'Meet for a quick lesson'
      },
      locations: [{
        rel: "g.event",
        label: "Event location",
        valueString: "Netherfield Park tennis court"
      }],
      times: [{
        startTime: google.gdata.DateTime.fromIso8601("2007-09-23T18:00:00.000Z"),
        endTime: google.gdata.DateTime.fromIso8601("2007-09-23T19:00:00.000Z")
      }]
  });
  feedRoot.feed.insertEntry(newEntry, handleMyInsertedEntry, handleError);
}

মনে রাখবেন যে কনস্ট্রাক্টরে ব্যবহৃত প্রতিটি অবজেক্ট প্রপার্টির নাম সেই সম্পত্তির জন্য ব্যবহৃত সেটার পদ্ধতির নামের সাথে মিলে যায়। (উদাহরণস্বরূপ, সংশ্লিষ্ট JSON ক্ষেত্রের নামের সাথে মেলে।)

এছাড়াও মনে রাখবেন যে আপনি শুধু startTime এবং endTime এর জন্য ISO 8601 তারিখ ও সময় স্ট্রিং প্রদান করতে পারবেন না; আপনাকে প্রথমে fromIso8601() পদ্ধতির মাধ্যমে এই ধরনের স্ট্রিং চালাতে হবে।

পরিষেবাটি একটি entryRoot অবজেক্ট হিসাবে সন্নিবেশিত এন্ট্রির একটি অনুলিপি ফেরত দেয় এবং সেই বস্তুটিকে কলব্যাকে পাস করে:

function handleMyInsertedEntry(insertedEntryRoot) {
  alert("Entry inserted. The title is: " + insertedEntryRoot.entry.getTitle().getText());
  alert("The timestamp is: " + insertedEntryRoot.entry.getTimes()[0].startTime);
}

একটি নির্দিষ্ট এন্ট্রি অনুরোধ

একটি নির্দিষ্ট এন্ট্রির অনুরোধ করতে, প্রথমে একটি নতুন এন্ট্রি-রিকোয়েস্ট ফাংশন কল করতে handleMyInsertedEntry() ফাংশনটি পরিবর্তন করুন:

function handleMyInsertedEntry(insertedEntryRoot) {
  alert("Entry inserted. The title is: " + insertedEntryRoot.entry.getTitle().getText());
  alert("The timestamp is: " + insertedEntryRoot.entry.getTimes()[0].startTime);
  requestMySpecificEntry(insertedEntryRoot.entry.getSelfLink().getHref());
}

নিম্নলিখিত কোডটি আপনাকে নির্দিষ্ট এন্ট্রির অনুরোধ করতে দেয় যা আপনি আগের উদাহরণে সন্নিবেশিত করেছেন।

উদাহরণগুলির এই সিরিজের প্রেক্ষাপটে, সেই এন্ট্রিটি পুনরুদ্ধার করা সত্যিই প্রয়োজনীয় নয়, কারণ ক্যালেন্ডার ইতিমধ্যেই সন্নিবেশিত এন্ট্রি ফিরিয়ে দিয়েছে; কিন্তু যখনই আপনি একটি এন্ট্রির জন্য URI জানেন তখন একই কৌশল প্রয়োগ করা যেতে পারে।

function requestMySpecificEntry(entryURI) {
  myService.getEventsEntry(entryURI, handleMySpecificEntry, handleError);
}

function handleMySpecificEntry(retrievedEntryRoot) {
  myEntryRoot = retrievedEntryRoot; // Global variable for later use
  alert("This entry's title is: " + retrievedEntryRoot.entry.getTitle().getText());
}

এই উদাহরণটি মূলত getEventsFeed() উদাহরণের মতোই, আমরা একটি নির্দিষ্ট এন্ট্রি পেতে পরিষেবাটির getEventEntry() পদ্ধতিতে কল করছি, এবং URI একটু ভিন্ন-এটি প্রধান ক্যালেন্ডারে উল্লেখ করতে "ডিফল্ট" ব্যবহার করে প্রমাণীকৃত ব্যবহারকারীর জন্য, এবং এটির শেষে একটি এন্ট্রি আইডি রয়েছে।

এছাড়াও, আমাদের পরে পুনরুদ্ধার করা এন্ট্রিটি ব্যবহার করতে সক্ষম হতে হবে, তাই আমরা এটিকে একটি গ্লোবাল ভেরিয়েবলে কপি করছি।

এন্ট্রি অনুসন্ধান করা হচ্ছে

একটি পূর্ণ-পাঠ্য অনুসন্ধান সম্পাদন করতে, প্রথমে একটি নতুন অনুসন্ধান ফাংশন কল করতে handleMySpecificEntry() ফাংশনটি সংশোধন করুন:

function handleMySpecificEntry(retrievedEntryRoot) {
  myEntryRoot = retrievedEntryRoot; // Global variable for later use
  alert("This entry's title is: " + retrievedEntryRoot.entry.getTitle().getText());
  searchMyFeed();
}

তারপর অনুসন্ধান থেকে প্রথম মিল পুনরুদ্ধার করতে, নিম্নলিখিত কোড ব্যবহার করুন:

function searchMyFeed() {
  var myQuery = new google.gdata.calendar.CalendarEventQuery(feedUrl);
  myQuery.setFullTextQuery("Tennis");
  myQuery.setMaxResults(10);
  myService.getEventsFeed(myQuery, handleMyQueryResults, handleError);
}

function handleMyQueryResults(myResultsFeedRoot) {
  if (myResultsFeedRoot.feed.getEntries()[0]) {
    alert("The first search-match entry's title is: " + myResultsFeedRoot.feed.getEntries()[0].getTitle().getText());
  }
  else {
    alert("There are no entries that match the search query.");
  }
}

একটি আইটেম আপডেট করা হচ্ছে

একটি বিদ্যমান আইটেম আপডেট করতে, প্রথমে একটি নতুন আপডেট ফাংশন কল করতে handleMyQueryResults() এর শেষে একটি লাইন যোগ করুন:

  updateMyEntry();

তারপর নিচের কোডটি ব্যবহার করুন। এই উদাহরণে, আমরা পূর্বে পুনরুদ্ধার করা এন্ট্রির শিরোনাম (যা আগের উদাহরণে myEntryRoot নামে গ্লোবাল অবজেক্টে ছিল) এর পুরানো টেক্সট ("টেনিস উইথ ডার্সি") থেকে "গুরুত্বপূর্ণ মিটিং" এ পরিবর্তন করছি।

function updateMyEntry() {
  myEntryRoot.entry.getTitle().setText("Important meeting");
  myEntryRoot.entry.updateEntry(handleMyUpdatedEntry, handleError);
}

function handleMyUpdatedEntry(updatedEntryRoot) {
  alert("Entry updated. The new title is: " + updatedEntryRoot.entry.getTitle().getText());
}

সমস্ত ক্যালেন্ডার পদ্ধতির মতো, updateEntry() পদ্ধতি স্বয়ংক্রিয়ভাবে এন্ট্রি আপডেট করার জন্য ব্যবহার করার জন্য সঠিক সম্পাদনা URI নির্ধারণ করে, তাই আপনাকে স্পষ্টভাবে সেই URI প্রদান করতে হবে না।

একটি আইটেম মুছে ফেলা হচ্ছে

আপডেট করা এন্ট্রি মুছে ফেলতে প্রথমে একটি লাইন যোগ করুন handleMyUpdatedEntry() :

 deleteMyEntry(updatedEntryRoot);

তারপর নিম্নলিখিত কোড ব্যবহার করুন:

function deleteMyEntry(updatedEntryRoot) {
  updatedEntryRoot.entry.deleteEntry(handleMyDeletedEntry, handleError);
}

function handleMyDeletedEntry() {
  alert("Entry deleted");
}

আবার, deleteEntry() পদ্ধতি স্বয়ংক্রিয়ভাবে এন্ট্রি মুছে ফেলার জন্য ব্যবহার করার জন্য সঠিক সম্পাদনা URI নির্ধারণ করে।

উল্লেখ্য যে কোন এন্ট্রি ফেরত দেওয়া হয় না। যদি কলব্যাক বলা হয়, তাহলে আমরা জানি মুছে ফেলা সফল হয়েছে; যদি মুছে ফেলা ব্যর্থ হয়, তাহলে handleMyDeletedEntry() deleteEntry() handleError() কল করে।

ETags ব্যবহার করে

দ্রষ্টব্য : ETags শুধুমাত্র Google ডেটা প্রোটোকল v2.0 চালিত পরিষেবাগুলির সাথে ব্যবহার করা যেতে পারে৷

ভূমিকা

Google ডেটা জাভাস্ক্রিপ্ট ক্লায়েন্টের সংস্করণ 2 ETags-এর জন্য সমর্থন প্রবর্তন করে। ETags হল শনাক্তকারী যা একটি নির্দিষ্ট এন্ট্রির একটি নির্দিষ্ট সংস্করণ নির্দিষ্ট করে; এটি দুটি ক্ষেত্রে গুরুত্বপূর্ণ:

  • একটি "শর্তসাপেক্ষ পুনরুদ্ধার" করা হচ্ছে, যেখানে একজন ক্লায়েন্ট একটি এন্ট্রির অনুরোধ করে এবং সার্ভারটি শুধুমাত্র তখনই এন্ট্রি পাঠায় যদি ক্লায়েন্ট শেষবার অনুরোধ করার পর থেকে এন্ট্রিটি পরিবর্তিত হয়।
  • নিশ্চিত করা যে একাধিক ক্লায়েন্ট অসাবধানতাবশত একে অপরের পরিবর্তনগুলি ওভাররাইট করে না। ক্লায়েন্ট এন্ট্রির জন্য একটি পুরানো ETag উল্লেখ করলে ডেটা এপিআই আপডেট এবং মুছে ফেলতে ব্যর্থ হয়ে এটি করে।

দুই ধরনের ETags আছে: দুর্বল এবং শক্তিশালী। একটি দুর্বল ETag সবসময় W/ দিয়ে শুরু হয়, যেমন: W/"D08FQn8-eil7ImA9WxZbFEw" । এন্ট্রি পরিবর্তন হলে দুর্বল ETags পরিবর্তন করার নিশ্চয়তা দেওয়া হয় না, এবং তাই HTTP তাদের শুধুমাত্র শর্তসাপেক্ষ পুনরুদ্ধারের জন্য ব্যবহার করার অনুমতি দেয়। শক্তিশালী ETags একটি নির্দিষ্ট এন্ট্রির একটি নির্দিষ্ট সংস্করণ সনাক্ত করে, এবং শর্তসাপেক্ষ পুনরুদ্ধারের জন্য এবং আপডেট বা মুছে ফেলার সময় উভয়ই ব্যবহার করা যেতে পারে যাতে অন্য ক্লায়েন্টদের পরিবর্তন ওভাররাইট করা না হয়। এই পার্থক্যের কারণে, ক্লায়েন্ট লাইব্রেরি আপনাকে একটি আপডেট বা মুছে ফেলার অনুরোধ সহ দুর্বল ETags পাঠাতে দেবে না।

সার্ভারের প্রতিক্রিয়াতে ETags দুটি স্থানে পাওয়া যাবে:

  • ETag HTTP হেডারে।
  • ফিড/এন্ট্রিতে, gd:etag অ্যাট্রিবিউট হিসেবে।

যদি একটি পরিষেবা সংস্করণ 2 সমর্থন করে, প্রতিটি ফিড এবং এন্ট্রি অবজেক্টে ETag-এর মান পুনরুদ্ধার করার জন্য একটি getEtag() পদ্ধতি থাকবে।

জাভাস্ক্রিপ্ট ক্লায়েন্ট একটি অনুরোধ সহ ETags অন্তর্ভুক্ত করার জন্য দুটি পদ্ধতি সমর্থন করে। প্রথমটি হল নতুন opt_params অবজেক্ট। ক্লায়েন্ট লাইব্রেরির সংস্করণ 2-এ সমস্ত get/update/insert ফাংশনে একটি নতুন opt_params প্যারামিটার রয়েছে। এই বস্তুটি একটি অনুরোধ করার সময় ঐচ্ছিক পরামিতি নির্দিষ্ট করতে ব্যবহৃত হয়। আপাতত, 'etag' হল একমাত্র সমর্থিত ঐচ্ছিক প্যারামিটার (যদিও ভবিষ্যতে অন্যান্য প্যারামিটার চালু করা হতে পারে)। উদাহরণস্বরূপ, আপনি এইরকম একটি GET অনুরোধে একটি ETag যোগ করতে পারেন:

var opt_params = {};
opt_params['etag'] = 'ETAG GOES HERE';
service.getFeed(uri, successHandler, errorHandler, opt_params);

আপনি ফিড/এন্ট্রিতে setEtag() পদ্ধতিতে কল করে সরাসরি একটি ফিড বা এন্ট্রি অবজেক্টে একটি ETag যোগ করতে পারেন।

আপনি GData প্রোটোকল রেফারেন্স থেকে ETags সম্পর্কে আরও জানতে পারেন।

ডেটা পুনরুদ্ধার করতে ETags ব্যবহার করা

ডেটা পুনরুদ্ধার করার সময় ETags ব্যান্ডউইথ এবং কার্যকর করার সময় কমাতে সাহায্য করতে পারে। If-None-Match header:

If-None-Match: ETAG GOES HERE

যদি ETag ফিড বা এন্ট্রির বর্তমান সংস্করণের সাথে মিলে যায়, তাহলে সার্ভার একটি 304 NOT MODIFIED প্রতিক্রিয়া এবং একটি খালি বডি দিয়ে প্রতিক্রিয়া জানায়৷ অন্যথায়, সার্ভার একটি 200 OK প্রতিক্রিয়া এবং ফিড বা এন্ট্রি ডেটা সহ সাড়া দেয়।

আপনি অনুরোধ করার সময় একটি 'etag' প্যারামিটার অন্তর্ভুক্ত করে জাভাস্ক্রিপ্ট ক্লায়েন্টে ETags ব্যবহার করতে পারেন:

var etag = feed.getEtag(); // Feed loaded from a previous request
var opt_params = {};
opt_params['etag'] = etag;
service.getFeed(feedUrl, successHandler, errorHandler, opt_params);

শর্তসাপেক্ষ পুনরুদ্ধার শক্তিশালী এবং দুর্বল উভয় ETags এর সাথে কাজ করে। যদি ETag একটি মিল হয়, তাহলে ত্রুটি হ্যান্ডলারকে 304 প্রতিক্রিয়া সহ কল ​​করা হবে:

function successHandler(feedRoot) {
  // 200 response
  // Update UI to display updates
}

function errorHandler(errorObj) {
  if (errorObj.cause.getStatus() == 304) {
    // 304 response, do nothing
  }
  // otherwise the response is some other error
}

JavaScript ক্লায়েন্টে ETags ব্যবহার করার আরও বাস্তব উদাহরণ দেখতে ব্লগার ব্যবহার করে শর্তসাপেক্ষ পুনরুদ্ধারের নমুনা দেখুন। এই নমুনাটি আপনার ব্লগের আপডেটের জন্য 5 সেকেন্ডের ব্যবধানে ব্লগারকে পোল করে। যখন পরিবর্তন হয়, নমুনা পোস্টের একটি তালিকা আপডেট করে।

ডেটা আপডেট এবং মুছে ফেলার জন্য ETags ব্যবহার করা

আপডেট/মোছার অনুরোধে ETags ব্যবহার করা নিশ্চিত করে যে একাধিক ক্লায়েন্ট অসাবধানতাবশত একে অপরের পরিবর্তনগুলিকে ওভাররাইট করে না। এই ক্ষেত্রে, If-Match হেডারের সাথে একটি ETag অন্তর্ভুক্ত করা হয়েছে:

If-Match: ETAG GOES HERE

অনুরোধের ETag সার্ভারের ETag-এর সাথে মেলে, আপডেট/মুছে ফেলা সফল হয়। তবে একটি ETag অমিল নির্দেশ করে যে এন্ট্রি পরিবর্তিত হয়েছে এবং আপডেট/মুছে ফেলতে ব্যর্থ হয়েছে। এই ক্ষেত্রে, অ্যাপ্লিকেশনটিকে ডেটার একটি নতুন উদাহরণের অনুরোধ করা উচিত এবং তারপরে আবার আপডেট/মুছে ফেলার চেষ্টা করা উচিত।

কিছু ক্ষেত্রে, আপনি এন্ট্রিতে অন্য কোনো পরিবর্তন নির্বিশেষে আপনার পরিবর্তনগুলি জোরপূর্বক করতে চাইতে পারেন। If-Match হেডারে একটি * পাস করে আপনি এটি করতে পারেন:

If-Match: *

মনে রাখবেন যে এটি অন্যান্য ক্লায়েন্টদের দ্বারা করা পরিবর্তনগুলিকে ওভাররাইড করবে, তাই এটি সাবধানে ব্যবহার করুন৷

আপনি শুধুমাত্র একটি শক্তিশালী ETag সহ একটি এন্ট্রি আপডেট/মুছে ফেলতে পারেন। একটি দুর্বল ETag উল্লেখ করলে একটি ত্রুটি দেখা দেবে৷ এই ক্ষেত্রে থেকে রক্ষা করার জন্য, জাভাস্ক্রিপ্ট ক্লায়েন্ট আপডেট এবং মুছে ফেলার অনুরোধে দুর্বল ETags সেট করবে না।

ETags একইভাবে শর্তসাপেক্ষ পুনরুদ্ধার হিসাবে ব্যবহার করা হয়:

function updateData(entry, service) {
  var etag = entry.getEtag();
  var opt_params = {};
  opt_params['etag'] = etag; // Or use '*' to force an update.
  service.updateEntry(successHandler, errorHandler, opt_params);
}

function successHandler(response) {
  // Successful update
}

function errorHandler(errorObj) {
  // ERROR - Update failed. Could be due to an ETag mismatch, but check the
  // error message to make sure. An ETag error will be in the format:
  // Mismatch: etags = ["Qnc-fTVSLyp7ImA9WxJbFEsDRAw."], version = [1249675665358000]
}

আপডেট করার সময়, একটি ETag দুটি জায়গায় নির্দিষ্ট করা যেতে পারে:

  1. এন্ট্রিতে নিজেই, getEtag() এবং setEtag() পদ্ধতি ব্যবহার করে।
  2. হেডারে, opt_params অবজেক্ট ব্যবহার করে (উপরে প্রদর্শিত হিসাবে)।

একটি পূর্ববর্তী GET অনুরোধ থেকে লোড করা একটি এন্ট্রিতে ইতিমধ্যেই একটি ETag ফিল্ড সেট থাকবে৷ তাই opt_params অবজেক্টে একই ETag উল্লেখ করা অপ্রয়োজনীয়। যে ক্ষেত্রে একটি ETag এন্ট্রি বডি এবং opt_params উভয় ক্ষেত্রেই নির্দিষ্ট করা আছে, opt_params এ ETag অগ্রাধিকার পাবে। এটি কিছুটা বিভ্রান্তিকর হতে পারে, তাই আপনার যদি শর্তসাপেক্ষ আপডেটের সাথে সমস্যা হয়, তাহলে এন্ট্রি এবং opt_params অবজেক্ট উভয়েই ETag চেক করতে ভুলবেন না।

জিনিসগুলিকে সহজ করার জন্য, google.gdata.Entry ক্লাসগুলির নিজস্ব updateEntry() এবং deleteEntry() পদ্ধতি রয়েছে৷ যদি এন্ট্রি ক্লাসে ইতিমধ্যেই একটি ETag থাকে, তাহলে আপনাকে অনুরোধে এটি যোগ করতে হবে না; ক্লায়েন্ট লাইব্রেরি আপনার জন্য স্বয়ংক্রিয়ভাবে এটি করবে। উদাহরণ স্বরূপ:

// entry was loaded from a previous request.  No need to specify
// an ETag in opt_params here, it is added automatically.
entry.deleteEntry(successHandler, errorHandler);

এটি আপনাকে ETags এর সুবিধা দেয় যদি আপনি সেগুলি সঠিকভাবে সেট করেন তবে চিন্তা না করে। তবে আপনি যদি '*' ব্যবহার করে জোর করে আপডেট করতে চান, তাহলে আপনাকে অবশ্যই সর্বদা 'etag' = '*' সহ opt_params অবজেক্ট অন্তর্ভুক্ত করতে হবে।

আপনি পরিচিতিতে শর্তসাপেক্ষ আপডেটে কর্মক্ষেত্রে শর্তসাপেক্ষ আপডেট দেখতে পারেন। নমুনাটি প্রথমে একটি পরীক্ষার যোগাযোগ গ্রুপ তৈরি করে যেখানে এই নমুনা দ্বারা ব্যবহৃত সমস্ত ডেটা তৈরি করা হবে। আপনি নমুনা ব্যবহার করা শেষ হলে এই যোগাযোগ গ্রুপটি মুছে ফেলতে দ্বিধা বোধ করবেন না। নমুনা তারপর কন্টাক্ট গ্রুপ থেকে বিষয়বস্তু সহ দুটি আইফ্রেম লোড করে। আপনি একটি আইফ্রেমে আপডেট করতে পারেন এবং এটি কীভাবে অন্য আইফ্রেমে আপডেটগুলিকে প্রভাবিত করে তা দেখতে পারেন। এটি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও বিস্তারিত জানার জন্য নমুনাটি দেখুন।

নমুনা

রেফারেন্স

ক্লায়েন্ট লাইব্রেরি দ্বারা প্রদত্ত ক্লাস এবং পদ্ধতি সম্পর্কে তথ্যের জন্য, JavaScript ক্লায়েন্ট লাইব্রেরি API রেফারেন্স দেখুন (JSdoc ফর্ম্যাটে)।

উপরে ফিরে যাও