REST ওয়েব পরিষেবাদিতে ব্যাচ অপারেশন পরিচালনা করার জন্য প্যাটার্নস?


170

একটি REST শৈলীর ওয়েব পরিষেবাদির মধ্যে সংস্থাগুলিতে ব্যাচের ক্রিয়াকলাপগুলির জন্য কোন প্রমাণিত নকশার নিদর্শন বিদ্যমান?

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

কিছু ক্ষেত্রে রয়েছে যেখানে আপনি সামগ্রীর সম্পূর্ণ সেটগুলির একক ক্ষেত্রটি আপডেট করতে চান। এক এক ক্ষেত্র আপডেট করার জন্য প্রতিটি বস্তুর পিছনে পিছনে সম্পূর্ণ উপস্থাপনাটি প্রেরণ করা খুব অপব্যয়জনক বলে মনে হচ্ছে।

আরপিসি স্টাইলের এপিআইতে আপনার একটি পদ্ধতি থাকতে পারে:

/mail.do?method=markAsRead&messageIds=1,2,3,4... etc. 

এখানে রেস্ট সমতুল্য কি? বা এখন এবং পরে আপস করা ঠিক আছে? এটি কি কয়েকটি নির্দিষ্ট ক্রিয়াকলাপে যুক্ত করার নকশাকে নষ্ট করে দেয় যেখানে এটি সত্যিই কর্মক্ষমতা ইত্যাদি উন্নত করে? এখনই সমস্ত ক্ষেত্রে ক্লায়েন্ট হ'ল একটি ওয়েব ব্রাউজার (ক্লায়েন্টের পাশে জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন)।

উত্তর:


77

ব্যাচগুলির জন্য একটি সাধারণ RESTful প্যাটার্ন হ'ল সংগ্রহের সংস্থান ব্যবহার করা। উদাহরণস্বরূপ, একবারে বেশ কয়েকটি বার্তা মুছতে।

DELETE /mail?&id=0&id=1&id=2

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

POST /mail?markAsRead=true
POSTDATA: ids=[0,1,2]

মূলত, আপনি পঠিত হিসাবে চিহ্নিত মেলের তালিকা আপডেট করছেন।

আপনি একই বিভাগে বেশ কয়েকটি আইটেম বরাদ্দের জন্য এটি ব্যবহার করতে পারেন।

POST /mail?category=junk
POSTDATA: ids=[0,1,2]

আইটিউনস-স্টাইলে ব্যাচের আংশিক আপডেটগুলি করা (যেমন, শিল্পী + অ্যালবাম টাইটেল তবে ট্র্যাকটাইটেল নয়) করা স্পষ্টতই আরও জটিল। বালতি উপমাটি ভেঙে যেতে শুরু করে।

POST /mail?markAsRead=true&category=junk
POSTDATA: ids=[0,1,2]

দীর্ঘমেয়াদে, একটি একক আংশিক সংস্থান বা সংস্থান বৈশিষ্ট্য আপডেট করা আরও সহজ much কেবল একটি সাবসোর্স ব্যবহার করুন।

POST /mail/0/markAsRead
POSTDATA: true

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

বিভিন্ন বৈশিষ্ট্য, বিভিন্ন সংস্থান আপডেট করুন:

POST /mail/0;1;2/markAsRead;category
POSTDATA: markAsRead=true,category=junk

একাধিক সংস্থান আপডেট করুন, কেবল একটি বৈশিষ্ট্য:

POST /mail/0;1;2/markAsRead
POSTDATA: true

কয়েকটি বৈশিষ্ট্য আপডেট করুন, কেবল একটি সংস্থান:

POST /mail/0/markAsRead;category
POSTDATA: markAsRead=true,category=junk

RESTful সৃজনশীলতা প্রচুর।


1
আপনার ডিলিটটি আসলে একটি পোস্ট হওয়া উচিত কারণ এটি আসলে সেই সংস্থানটি ধ্বংস করে না that
ক্রিস নিকোলা

6
এটি প্রয়োজনীয় নয়। POST একটি কারখানা-প্যাটার্ন পদ্ধতি, এটি PUT / DELETE / GET এর চেয়ে কম স্বচ্ছ এবং স্পষ্ট। একমাত্র প্রত্যাশা হ'ল পোষ্টের ফলাফল হিসাবে সার্ভারটি সিদ্ধান্ত নেবে। পোস্ট সর্বদা ঠিক যা ছিল তাই আমি ফর্ম ডেটা জমা করি এবং সার্ভারটি কিছু করে (আশা করি প্রত্যাশিত) এবং ফলাফল হিসাবে আমাকে কিছু ইঙ্গিত দেয়। আমাদের পোষ্ট দিয়ে সংস্থান তৈরি করার দরকার নেই, আমরা প্রায়শই পছন্দ করি। আমি সহজেই পিটিউটের সাহায্যে একটি সংস্থান তৈরি করতে পারি, আমাকে কেবল প্রেরক হিসাবে সংস্থান URL টি সংজ্ঞায়িত করতে হবে (প্রায়শই আদর্শ নয়)।
ক্রিস নিকোলা

1
@ নিশান্ট, এক্ষেত্রে আপনার সম্ভবত ইউআরআইতে একাধিক সংস্থান রেফারেন্স করার দরকার নেই, তবে কেবল অনুরোধের শর্তে রেফারেন্স / মান সহ কেবলমাত্র টুপলগুলি পাস করুন। উদাহরণস্বরূপ, পোস্ট / মেইল ​​/ চিহ্নআসরেড, শারীরিক: i_0_id = 0 এবং i_0_value = সত্য & i_1_id = 1 এবং i_1_value = মিথ্যা এবং i_2_id = 2 এবং i_2_value = সত্য
অ্যালেক্স

3
সেমিকোলন এই উদ্দেশ্যে সংরক্ষিত।
অ্যালেক্স

1
আশ্চর্যরূপে যে কেউই উল্লেখ করেনি যে একটি একক সংস্থানতে বেশ কয়েকটি বৈশিষ্ট্য আপডেট করা সুন্দরভাবে কভার করা যায় PATCH- এই ক্ষেত্রে সৃজনশীলতার কোনও প্রয়োজন নেই।
এলবি

25

মোটেও নয় - আমি মনে করি REST সমতুল্য (বা কমপক্ষে একটি সমাধান হ'ল) ​​প্রায় ঠিক এটি - ডিজাইন করা একটি বিশেষ ইন্টারফেস ক্লায়েন্টের প্রয়োজনীয় অপারেশনকে সমন্বিত করে।

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

অবজেক্টটি, যদি আমি সঠিকভাবে মনে করি, মূলত "কমান্ড" এর একটি অ্যারে রাখা হয়েছিল - উদাহরণস্বরূপ, আপনার উদাহরণটি প্রসারিত করার জন্য, প্রত্যেকটি একটি রেকর্ডে "মার্কএএসআরএইড" কমান্ড, একটি "ম্যাসেজআইডি" এবং সম্ভবত একটি কলব্যাক / হ্যান্ডলারের রেফারেন্স রয়েছে ফাংশন - এবং তারপরে কিছু তফসিল অনুসারে বা কোনও ব্যবহারকারীর ক্রিয়া অনুসারে কমান্ড অবজেক্টটি সিরিয়ালযুক্ত করে সার্ভারে পোস্ট করা হত এবং ক্লায়েন্টটি পরবর্তী পোস্ট-প্রসেসিং পরিচালনা করবে।

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


আপডেট : আহা! আমি অনলাইনে সেই একই বই থেকে একটি স্নিপ খুঁজে পেয়েছি, কোডের নমুনাগুলি দিয়ে সম্পূর্ণ (যদিও আমি এখনও সত্যিকারের বইটি তুলে দেওয়ার পরামর্শ দিই!)! বিভাগটি 5.5.3 দিয়ে শুরু করে দেখুন এখানে :

এটি কোড করা সহজ তবে সার্ভারে প্রচুর সংখ্যক ট্রাফিকের বিস্তৃতি ঘটতে পারে যা অকার্যকর এবং সম্ভাব্য বিভ্রান্তিকর। আমরা যদি আমাদের ট্র্যাফিক নিয়ন্ত্রণ করতে চাই, আমরা এই আপডেটগুলি ক্যাপচার করতে পারি এবং সেগুলি স্থানীয়ভাবে সারি করতে পারি এবং তারপরে আমাদের অবসর সময়ে ব্যাচে সার্ভারে প্রেরণ করতে পারি। 5.13 তালিকাতে জাভাস্ক্রিপ্টে প্রয়োগ করা হয়েছে একটি সাধারণ আপডেট ক্যু shown [...]

সারি দুটি অ্যারে বজায় রাখে। queued একটি সংখ্যামূলকভাবে সূচকযুক্ত অ্যারে, যাতে নতুন আপডেট যুক্ত হয়। sent সার্ভারে প্রেরণ করা হয়েছে তবে সেগুলি একটি উত্তরের অপেক্ষায় থাকা আপডেটগুলি সমেত একটি সংঘবদ্ধ অ্যারে।

এখানে দুটি প্রাসঙ্গিক ফাংশন রয়েছে - একটি কাতারে কমান্ড যুক্ত করার জন্য দায়ী ( addCommand), এবং একটি সিরিয়ালাইজ করার জন্য এবং তারপরে সেগুলি সার্ভারে প্রেরণের জন্য দায়ী fireRequest:

CommandQueue.prototype.addCommand = function(command)
{ 
    if (this.isCommand(command))
    {
        this.queue.append(command,true);
    }
}

CommandQueue.prototype.fireRequest = function()
{
    if (this.queued.length == 0)
    { 
        return; 
    }

    var data="data=";

    for (var i = 0; i < this.queued.length; i++)
    { 
        var cmd = this.queued[i]; 
        if (this.isCommand(cmd))
        {
            data += cmd.toRequestString(); 
            this.sent[cmd.id] = cmd;

            // ... and then send the contents of data in a POST request
        }
    }
}

এটি আপনাকে যেতে বাধ্য করা উচিত। শুভকামনা!


ধন্যবাদ। এটি যদি আমরা ক্লায়েন্টের উপর ব্যাচ অপারেশনগুলি রাখি তবে আমি কীভাবে এগিয়ে যাব সে সম্পর্কে আমার ধারণাগুলির সাথে এটি খুব মিল similar সমস্যাটি প্রচুর পরিমাণে অবজেক্টে কোনও ক্রিয়াকলাপ সম্পাদনের জন্য রাউন্ড ট্রিপ সময়।
মার্ক রেনৌফ

এইচএম, ঠিক আছে - আমি ভেবেছিলাম আপনি একটি হালকা ওজনের অনুরোধের মাধ্যমে বিপুল সংখ্যক অবজেক্টগুলিতে (সার্ভারে) অপারেশনটি করতে চান wanted আমি কি ভুল বুঝেছি?
খ্রিস্টান নুনসিটো

হ্যাঁ, তবে আমি দেখতে পাচ্ছি না যে কোড নমুনাটি আরও কার্যকরভাবে কীভাবে অপারেশনটি সম্পাদন করবে। এটি অনুরোধগুলি ব্যাচ করে তবে তবুও সেগুলি একবারে সার্ভারে প্রেরণ করে। আমি কি ভুল ব্যাখ্যা দিচ্ছি?
মার্ক রেনুফ

প্রকৃতপক্ষে এটি তাদের ব্যাচ করে এবং তারপরে তাদের সকলকে একবারে প্রেরণ করে: ফায়ারউকুয়েস্টের লুপের জন্য () অবশ্যই সমস্ত অসামান্য কমান্ড সংগ্রহ করে, স্ট্রিং হিসাবে সিরিয়ালাইজ করে (.toRequestString () সহ, উদাহরণস্বরূপ, "মেথড = মার্কএসারড & ম্যাসেজআইডিএস = 1,2,3 , 4 "), স্ট্রিংটিকে" ডেটা "এবং সার্ভারকে POSTs ডেটা বরাদ্দ করে।
খ্রিস্টান নুনিসাতো

20

যদিও আমি মনে করি @ অ্যালেক্স সঠিক পথের সাথে রয়েছে, ধারণাটিগতভাবে আমি মনে করি এটির প্রস্তাবিতগুলির বিপরীত হওয়া উচিত।

ইউআরএল কার্যকরভাবে "আমরা যে সংস্থানগুলিকে টার্গেট করছি" তাই কার্যকরভাবে রয়েছে:

    [GET] mail/1

মানে আইডি 1 এবং এর সাথে মেল থেকে রেকর্ড পান

    [PATCH] mail/1 data: mail[markAsRead]=true

মানে আইডির সাথে মেল রেকর্ডটি প্যাচ করুন The কোয়েরিস্ট্রিংটি একটি "ফিল্টার", ইউআরএল থেকে ফিরিয়ে নেওয়া ডেটা ফিল্টার করে।

    [GET] mail?markAsRead=true

সুতরাং এখানে আমরা ইতিমধ্যে পঠিত হিসাবে চিহ্নিত সমস্ত মেল অনুরোধ করছি। সুতরাং এই পথে [প্যাচ] বলছে " ইতিমধ্যে রেকর্ডগুলি প্যাচ করুন সত্য হিসাবে চিহ্নিত চিহ্নিত " ... যা আমরা অর্জন করার চেষ্টা করছি না এটি।

সুতরাং একটি ব্যাচ পদ্ধতি, এই চিন্তাভাবনা অনুসরণ করা উচিত:

    [PATCH] mail/?id=1,2,3 <the records we are targeting> data: mail[markAsRead]=true

অবশ্যই আমি বলছি না এটি সত্য বিশ্রাম (যা ব্যাচের রেকর্ড ম্যানিপুলেশনের অনুমতি দেয় না), বরং এটি ইতিমধ্যে বিদ্যমান এবং আরএসটি দ্বারা ব্যবহারে যুক্তি অনুসরণ করে।


আকর্ষণীয় উত্তর! আপনার শেষ উদাহরণের জন্য, এটি করা (বা এমনকি ) [GET]বিন্যাসের সাথে আরও সুসংগত হবে না ? এই বিকল্প পদ্ধতির আরেকটি সুবিধা হ'ল আপনি সংগ্রহে কয়েকশ / হাজার সংস্থান আপডেট করে থাকলে আপনি "414 অনুরোধ ইউআরআই খুব দীর্ঘ" ত্রুটিগুলির বিরুদ্ধে চলে যাবেন না। [PATCH] mail?markAsRead=true data: [{"id": 1}, {"id": 2}, {"id": 3}]data: {"ids": [1,2,3]}
রিনোগো

@ রিনোগো - আসলে না আমি এই বিষয়টি তৈরি করছিলাম। ক্যোরিস্ট্রিং হ'ল রেকর্ডগুলির জন্য ফিল্টার যা আমরা কাজ করতে চাই (উদা। [জিইটি] মেইল ​​/ 1 মেল রেকর্ড 1 এর আইডি সহ পেয়েছে, যখন [জিইটি] মেল? মার্কাসআরেড = সত্য রিটার্ন মেল যেখানে মার্কএএসআরইড ইতিমধ্যে সত্য)। সেই একই ইউআরএলে প্যাচ করা কোনও অর্থবোধ করে না (উদাহরণস্বরূপ "চিহ্নিত রেকর্ডগুলি প্যাচ করুন যেখানে চিহ্নএএসআরেড = সত্য") যখন আমরা ক্ষেত্রের চিহ্নএএসরেডের বর্তমান স্থিতির তুলনায় আইডিসি 1,2,3, নির্দিষ্ট রেকর্ডের সাথে নির্দিষ্ট রেকর্ড প্যাচ করতে চাই। অতএব আমি যে পদ্ধতিটি বর্ণনা করেছি। একাধিক রেকর্ড আপডেট করার সাথে সমস্যা আছে বলে সম্মত হন। আমি একটি কম শক্তভাবে মিলিত শেষ পয়েন্ট তৈরি করব।
ফিজফক্স

11

আপনার ভাষা, " মনে হচ্ছে খুব অপব্যয়কর ...", আমার কাছে অকাল অপটিমাইজেশনের প্রয়াসকে ইঙ্গিত করে। যদি না এটি প্রদর্শিত না হয় যে অবজেক্টগুলির সম্পূর্ণ প্রতিনিধিত্ব পাঠানো একটি বড় পারফরম্যান্স হিট (আমরা ব্যবহারকারীদের কাছে> 150 মিম হিসাবে গ্রহণযোগ্য নয়) তখন নতুন অ-মানক এপিআই আচরণ তৈরি করার চেষ্টা করার কোনও মানে নেই। মনে রাখবেন, এত সহজে যত সহজে API ব্যবহার করা যায় তত সহজ।

মুছে ফেলার জন্য নিম্নলিখিতটি প্রেরণ করুন কারণ মুছে ফেলার আগে সার্ভারকে বস্তুর অবস্থা সম্পর্কে কিছু জানতে হবে না।

DELETE /emails
POSTDATA: [{id:1},{id:2}]

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

উদাহরণ হিসাবে দুটি পৃথক ইমেলের "পড়ুন" এবং "সংরক্ষণাগারভুক্ত" স্ট্যাটাসগুলি আপডেট করার প্রতিক্রিয়া পাঠানোর সময় আপনাকে নিম্নলিখিতগুলি পাঠাতে হবে:

PUT /emails
POSTDATA: [
            {
              id:1,
              to:"someone@bratwurst.com",
              from:"someguy@frommyville.com",
              subject:"Try this recipe!",
              text:"1LB Pork Sausage, 1 Onion, 1T Black Pepper, 1t Salt, 1t Mustard Powder",
              read:true,
              archived:true,
              importance:2,
              labels:["Someone","Mustard"]
            },
            {
              id:2,
              to:"someone@bratwurst.com",
              from:"someguy@frommyville.com",
              subject:"Try this recipe (With Fix)",
              text:"1LB Pork Sausage, 1 Onion, 1T Black Pepper, 1t Salt, 1T Mustard Powder, 1t Garlic Powder",
              read:true,
              archived:false,
              importance:1,
              labels:["Someone","Mustard"]
            }
            ]

আমি ইমেলের পরিবর্তিত উপাদানগুলি (পড়ুন, সংরক্ষণাগারভুক্ত, গুরুত্ব, লেবেলগুলি) আলাদা আলাদা অবজেক্টে ভাগ করে নেব অন্য হিসাবে (থেকে, বিষয়, পাঠ্য) কখনই আপডেট হবে না।

PUT /email-statuses
POSTDATA: [
            {id:15,read:true,archived:true,importance:2,labels:["Someone","Mustard"]},
            {id:27,read:true,archived:false,importance:1,labels:["Someone","Mustard"]}
          ]

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

PATCH /emails
POSTDATA: [
            {
              id:1,
              read:true,
              archived:true
            },
            {
              id:2,
              read:true,
              archived:false
            }
          ]

লোকেদের বক্তব্য: PATCH বাস্তবায়িত হওয়া উচিত: এ্যাকশন (সিআরইউডি), পাথ (ইউআরএল) এবং মান পরিবর্তন সহ এমন একটি অ্যারে সরবরাহ করে by এটি একটি স্ট্যান্ডার্ড বাস্তবায়ন হিসাবে বিবেচিত হতে পারে তবে আপনি যদি কোনও REST এপিআইয়ের সম্পূর্ণতা দেখেন তবে এটি একটি স্বজ্ঞাত নয় one এছাড়াও, উপরের বাস্তবায়নটি কীভাবে গিটহাব প্যাচচ বাস্তবায়ন করেছে

এটির সংক্ষেপে, ব্যাচের ক্রিয়া সহ RESTful নীতিগুলি মেনে চলা সম্ভব এবং এখনও গ্রহণযোগ্য পারফরম্যান্স থাকতে পারে।


আমি সম্মত হলাম যে প্যাচচচটি সর্বাধিক বোধ করে, সমস্যাটি হ'ল যদি সেই বৈশিষ্ট্যগুলি পরিবর্তিত হয় তখন আপনার যদি অন্য রাষ্ট্রীয় রূপান্তর কোড চালিত হয়, তবে সাধারণ প্যাচএইচএচ হিসাবে প্রয়োগ করা আরও কঠিন হয়ে পড়ে। আমি মনে করি না যে REST সত্যিই কোনও ধরণের রাষ্ট্রীয় রূপান্তরকে সামঞ্জস্য করে, যদিও এটি রাষ্ট্রহীন বলে মনে করা হয়, এটি বর্তমানে কী অবস্থা থেকে কেবল কী রূপান্তরিত হচ্ছে তা তার যত্ন নেয় না।
বেনিরোজ

আরে বেনিরোজ, একটি মন্তব্য যুক্ত করার জন্য ধন্যবাদ, আমি প্রায়শই অবাক হই যে লোকেরা এই পোস্টগুলির মধ্যে কিছু দেখে। লোকেরা তা দেখে আনন্দিত হয়। আরইএসটি-র "রাষ্ট্রবিহীন" প্রকৃতি সম্পর্কিত সংস্থানগুলি সার্ভারের সাথে অনুরোধ জুড়ে রাষ্ট্র বজায় না রাখার বিষয়টি উদ্বেগ হিসাবে সংজ্ঞায়িত করে। যেমনটি, আপনি কী ইস্যুটি বর্ণনা করছেন তা আমার কাছে পরিষ্কার নয়, আপনি কি উদাহরণ দিয়ে বিস্তারিত বর্ণনা করতে পারেন?
justin.hughey

8

গুগল ড্রাইভ এপিআইতে এই সমস্যাটি সমাধান করার জন্য একটি সত্যই আকর্ষণীয় সিস্টেম রয়েছে ( এখানে দেখুন )।

তারা যা করে তা হ'ল একটি Content-Type: multipart/mixedঅনুরোধে বিভিন্ন অনুরোধকে গোষ্ঠীবদ্ধ করে প্রতিটি স্বতন্ত্র সম্পূর্ণ অনুরোধকে কিছু সংজ্ঞায়িত ডিলিমিটার দ্বারা পৃথক করে দেওয়া হয়। ব্যাচ অনুরোধের শিরোনাম এবং ক্যোয়ারী প্যারামিটার পৃথক অনুরোধে (যেমন Authorization: Bearer some_token) উত্তরাধিকার সূত্রে প্রাপ্ত হয় যতক্ষণ না তারা পৃথক অনুরোধে ওভাররাইড করা হয়।


উদাহরণ : (তাদের ডক্স থেকে নেওয়া )

অনুরোধ:

POST https://www.googleapis.com/batch

Accept-Encoding: gzip
User-Agent: Google-HTTP-Java-Client/1.20.0 (gzip)
Content-Type: multipart/mixed; boundary=END_OF_PART
Content-Length: 963

--END_OF_PART
Content-Length: 337
Content-Type: application/http
content-id: 1
content-transfer-encoding: binary


POST https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id
Authorization: Bearer authorization_token
Content-Length: 70
Content-Type: application/json; charset=UTF-8


{
  "emailAddress":"example@appsrocks.com",
  "role":"writer",
  "type":"user"
}
--END_OF_PART
Content-Length: 353
Content-Type: application/http
content-id: 2
content-transfer-encoding: binary


POST https://www.googleapis.com/drive/v3/files/fileId/permissions?fields=id&sendNotificationEmail=false
Authorization: Bearer authorization_token
Content-Length: 58
Content-Type: application/json; charset=UTF-8


{
  "domain":"appsrocks.com",
   "role":"reader",
   "type":"domain"
}
--END_OF_PART--

প্রতিক্রিয়া:

HTTP/1.1 200 OK
Alt-Svc: quic=":443"; p="1"; ma=604800
Server: GSE
Alternate-Protocol: 443:quic,p=1
X-Frame-Options: SAMEORIGIN
Content-Encoding: gzip
X-XSS-Protection: 1; mode=block
Content-Type: multipart/mixed; boundary=batch_6VIxXCQbJoQ_AATxy_GgFUk
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
Date: Fri, 13 Nov 2015 19:28:59 GMT
Cache-Control: private, max-age=0
Vary: X-Origin
Vary: Origin
Expires: Fri, 13 Nov 2015 19:28:59 GMT

--batch_6VIxXCQbJoQ_AATxy_GgFUk
Content-Type: application/http
Content-ID: response-1


HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Fri, 13 Nov 2015 19:28:59 GMT
Expires: Fri, 13 Nov 2015 19:28:59 GMT
Cache-Control: private, max-age=0
Content-Length: 35


{
 "id": "12218244892818058021i"
}


--batch_6VIxXCQbJoQ_AATxy_GgFUk
Content-Type: application/http
Content-ID: response-2


HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Date: Fri, 13 Nov 2015 19:28:59 GMT
Expires: Fri, 13 Nov 2015 19:28:59 GMT
Cache-Control: private, max-age=0
Content-Length: 35


{
 "id": "04109509152946699072k"
}


--batch_6VIxXCQbJoQ_AATxy_GgFUk--

1

আমি আপনার উদাহরণের মতো একটি অপারেশনে প্রলোভিত হয়ে একটি রেঞ্জ পার্সার লিখতে চাই।

"মেসেজআইডস = 1-3,7-9,11,12-15" পড়তে পারে এমন পার্সার তৈরি করা খুব বেশি মাথা ঘামায় না। এটি অবশ্যই সমস্ত বার্তাগুলি জুড়ে কম্বল অপারেশনের দক্ষতা বাড়িয়ে তুলবে এবং আরও স্কেলযোগ্য।


ভাল পর্যবেক্ষণ এবং একটি ভাল অপ্টিমাইজেশন, তবে প্রশ্নটি ছিল যে অনুরোধের এই স্টাইলটি আরএসইএসটি ধারণার সাথে কখনও "সামঞ্জস্যপূর্ণ" হতে পারে কি না।
মার্ক রেনুফ

হাই, হ্যাঁ আমি বুঝতে পারি অপ্টিমাইজেশান ধারণাটিকে আরও বিশ্রামযুক্ত করে তোলে এবং আমি আমার পরামর্শটি কেবলমাত্র বিষয় থেকে সামান্য পথে ঘুরে বেড়াতে থাকায় ছেড়ে যেতে চাইনি।

1

দুর্দান্ত পোস্ট। আমি কয়েক দিন ধরে সমাধানের সন্ধান করছি। আমি কমা দ্বারা পৃথক গুচ্ছ আইডি দিয়ে কোয়েরি স্ট্রিংটি ব্যবহার করার একটি সমাধান নিয়ে এসেছি, যেমন:

DELETE /my/uri/to/delete?id=1,2,3,4,5

... তারপরে WHERE INআমার এসকিউএল-এর একটি ধারাতে যাচ্ছি। এটি দুর্দান্ত কাজ করে তবে অন্যরা এই পদ্ধতির বিষয়ে কী ভাবেন তা অবাক করে।


1
আমি সত্যিই এটি পছন্দ করি না কারণ এটি একটি নতুন ধরণের পরিচয় করিয়ে দেয়, আপনি যে স্ট্রিংটি তালিকার ভিতরে ব্যবহার করেন সেখানে আমি এটির পরিবর্তে কোনও ভাষা নির্দিষ্ট ধরণের পার্স করব এবং তারপরে আমি একই পদ্ধতিটি ব্যবহার করতে পারি সিস্টেমের বিভিন্ন অংশে একইভাবে।
সফ্টনার

4
এসকিউএল ইনজেকশন আক্রমণ থেকে সাবধান হওয়ার জন্য একটি অনুস্মারক এবং সর্বদা আপনার ডেটা পরিষ্কার করে এবং এই পদ্ধতিটি গ্রহণ করার সময় বাইন্ড প্যারামিটার ব্যবহার করে।
justin.hughey

2
DELETE /books/delete?id=1,2,3# 3 বইয়ের অস্তিত্ব উপস্থিত না থাকার কাঙ্ক্ষিত আচরণের উপর নির্ভর করে - WHERE INচুপচাপ রেকর্ডগুলি উপেক্ষা করবে, আমি DELETE /books/delete?id=33 টি উপস্থিত না থাকলে সাধারণত 404 আশা করি ।
chbrown

3
আপনি এই সমাধানটি ব্যবহার করে চালাতে পারেন এমন একটি ভিন্ন সমস্যা হ'ল ইউআরএল স্ট্রিংয়ে থাকা অক্ষরের সীমাবদ্ধতা। যদি কেউ 5,000 রেকর্ড বাল্ক মুছার সিদ্ধান্ত নেয় তবে ব্রাউজারটি URL টি প্রত্যাখ্যান করতে পারে বা এইচটিটিপি সার্ভার (উদাহরণস্বরূপ অ্যাপাচি) এটিকে প্রত্যাখ্যান করতে পারে। সাধারণ নিয়ম (যা আশাকরি আরও ভাল সার্ভার এবং সফ্টওয়্যার দিয়ে পরিবর্তিত হচ্ছে) সর্বোচ্চ 2KB আকারের সাথে যেতে হয়েছিল। যেখানে কোনও পোস্টের বডি সহ আপনি 10 এমবি পর্যন্ত যেতে পারেন। stackoverflow.com/questions/2364840/...
justin.hughey

0

আমার দৃষ্টিকোণ থেকে আমি মনে করি ফেসবুকের সেরা বাস্তবায়ন রয়েছে।

ব্যাচের প্যারামিটার এবং একটি টোকেনের জন্য একটি সিঙ্গল এইচটিটিপি অনুরোধ করা হয়।

ব্যাচে একটি জেসন প্রেরণ করা হয়। এতে "অনুরোধগুলি" সংগ্রহ রয়েছে। প্রতিটি অনুরোধের একটি পদ্ধতি সম্পত্তি রয়েছে (get / post / put / মুছে ফেলুন / মুছুন / ইত্যাদি ...), এবং একটি আপেক্ষিক_ url সম্পত্তি (শেষ পয়েন্টের uri) রয়েছে, অতিরিক্তভাবে পোস্ট এবং পুস্তিকাগুলি একটি "দেহ" সম্পত্তি দেয় যেখানে ক্ষেত্রগুলি আপডেট করার সুযোগ দেয় পাঠানো হয় .

আরও তথ্য এখানে: ফেসবুক ব্যাচ এপিআই

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