দূরদৃষ্টির পরিবর্তনের জন্য REST এন্ডপয়েন্টস প্ল্যানিংয়ের প্রস্তাবিত প্যাটার্নটি কী


25

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

এই নিবন্ধের প্রাথমিক উদ্বেগটি কোনও প্রদত্ত পণ্য / সংস্থার জন্য সমস্ত সংজ্ঞায়িত শেষ পয়েন্টগুলির জন্য কোন প্যাটার্নটি অনুসরণ করা উচিত to

বেস স্কিম

https://rest.product.com/আমি একটি বেস ইউআরএল টেমপ্লেট দিয়েছি যে আমি তৈরি করেছি যে সমস্ত পরিষেবাদি /apiপাশাপাশি থাকা /authএবং অন্যান্য নন-রেস্ট বেসড এন্ডপয়েন্টগুলিতে থাকে /doc। অতএব আমি নীচের হিসাবে বেস সমাপ্তিগুলি স্থাপন করতে পারি:

https://rest.product.com/api/...
https://rest.product.com/auth/login
https://rest.product.com/auth/logout
https://rest.product.com/doc/...

পরিষেবা সমাপ্তি

এখন শেষ পয়েন্টগুলি তাদের জন্য। উদ্বেগের কথা POST, GET, DELETEএই প্রবন্ধের প্রাথমিক উদ্দেশ্য নয় এবং যারা কর্মের নিজেদের উপর উদ্বেগের বিষয়।

শেষের স্থানগুলি নামস্থান এবং ক্রিয়ায় বিভক্ত হতে পারে। রিটার্ন টাইপ বা প্রয়োজনীয় পরামিতিগুলিতে মৌলিক পরিবর্তনগুলিকে সমর্থন করার জন্য প্রতিটি ক্রিয়াকলাপ নিজেই উপস্থাপন করতে হবে।

একটি অনুমানমূলক চ্যাট পরিষেবা গ্রহণ করা যেখানে নিবন্ধিত ব্যবহারকারীরা নিম্নলিখিত বার্তাটি আমাদের কাছে পাঠাতে পারেন:

https://rest.product.com/api/messages/list/{user}
https://rest.product.com/api/messages/send

এখন ভবিষ্যতের এপিআই পরিবর্তনগুলির জন্য সংস্করণ সমর্থন যুক্ত করতে যা ভঙ্গ হতে পারে। আমরা হয় সংস্করণ স্বাক্ষর পরে /api/বা পরে যোগ করতে পারে /messages/। শেষের sendপয়েন্টটি দেওয়া হলে আমাদের নিম্নলিখিত ভি 1 এর জন্য নিম্নলিখিতটি থাকতে পারে।

https://rest.product.com/api/v1/messages/send
https://rest.product.com/api/messages/v1/send

সুতরাং আমার প্রথম প্রশ্নটি হল, সংস্করণ শনাক্তকারীর জন্য প্রস্তাবিত স্থানটি কী?

নিয়ন্ত্রণকারী কোড পরিচালনা করা

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

package com.product.messages.v1;
public interface MessageController {
    void send();
    Message[] list();
}

এর সুবিধাটি রয়েছে যে সমস্ত কোড নেমস্পেসের মাধ্যমে পৃথক করা হয়েছে যেখানে কোনও ব্রেকিং পরিবর্তনের অর্থ পরিষেবাটির শেষ পয়েন্টগুলির একটি নতুন অনুলিপি হবে। এর ক্ষতিকারকটি হ'ল সমস্ত কোড অনুলিপি করা প্রয়োজন এবং বাগ ফিক্সগুলি প্রতিটি অনুলিপিটির জন্য নতুন এবং পূর্ববর্তী সংস্করণগুলিতে প্রয়োগ / পরীক্ষা করা প্রয়োজন।

আরেকটি পদ্ধতি হ'ল প্রতিটি শেষ পয়েন্টের জন্য হ্যান্ডলার তৈরি করা।

package com.product.messages;
public class MessageServiceImpl {
    public void send(String version) {
        getMessageSender(version).send();
    }
    // Assume we have a List of senders in order of newest to oldest.
    private MessageSender getMessageSender(String version) {
        for (MessageSender s : senders) {
            if (s.supportsVersion(version)) {
                return s;
            }
        }
    }
}

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

সুতরাং আমার দ্বিতীয় প্রশ্নটি আছে "পূর্ববর্তী সংস্করণগুলিকে সমর্থন করার জন্য REST পরিষেবা কোডটি নকশা করার সর্বোত্তম উপায়" "

উত্তর:


13

সুতরাং আমার দ্বিতীয় প্রশ্নটি আছে "পূর্ববর্তী সংস্করণগুলিকে সমর্থন করার জন্য REST পরিষেবা কোডটি নকশা করার সর্বোত্তম উপায়" "

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

অবশ্যই, আপনি সম্ভবত প্রথম চেষ্টাটি পাবেন না; তাই:

  • আপনি যেমন পরিকল্পনা করছেন ঠিক তেমনই আপনার এপিআইর সংস্করণ করুন (এবং এটির মধ্যে পৃথক পদ্ধতি নয়, এটি এপিআইর রূপান্তরিত) এবং এ সম্পর্কে প্রচুর শব্দ করুন। আপনার অংশীদাররা জানেন যে এপিআই পরিবর্তন হতে পারে এবং তাদের অ্যাপ্লিকেশনগুলি সর্বশেষতম সংস্করণটি ব্যবহার করছে কিনা তা যাচাই করা উচিত কিনা তা নিশ্চিত করুন; এবং যখন কোনও নতুন পাওয়া যায় তখন ব্যবহারকারীদের আপগ্রেড করার পরামর্শ দিন। দুটি পুরানো সংস্করণ সমর্থন করা শক্ত, পাঁচটি সমর্থন করা অদম্য।
  • প্রতি "রিলিজ" দিয়ে এপিআই সংস্করণ আপডেট করার তাগিদ প্রতিরোধ করুন। নতুন বৈশিষ্ট্যগুলি সাধারণত বিদ্যমান ক্লায়েন্টদের না ভেঙে বর্তমান সংস্করণে ঘূর্ণিত করা যেতে পারে; তারা নতুন বৈশিষ্ট্য। আপনি যে সর্বশেষ জিনিসটি চান তা হ'ল ক্লায়েন্টদের সংস্করণ নম্বরটিকে উপেক্ষা করা , যেহেতু এটি বেশিরভাগ ক্ষেত্রেই পিছনের দিকে সামঞ্জস্যপূর্ণ। আপনি কেবলমাত্র এআইপি সংস্করণ আপডেট করুন যখন আপনি বিদ্যমান এআইপিটি না ভেঙে একেবারে এগিয়ে যেতে পারবেন না।
  • যখন নতুন সংস্করণ তৈরির সময় আসে তখন খুব প্রথম ক্লায়েন্টটি পূর্ববর্তী সংস্করণটির পিছনের দিকে সামঞ্জস্যপূর্ণ প্রয়োগ হওয়া উচিত। "রক্ষণাবেক্ষণ এপিআই" নিজেই বর্তমান এপিআইতে প্রয়োগ করা উচিত। বেশ কয়েকটি সম্পূর্ণ বাস্তবায়নকে মেন্টেন্ট করার জন্য আপনি এইভাবে নন; কেবলমাত্র বর্তমান সংস্করণ এবং পুরানো সংস্করণগুলির জন্য বেশ কয়েকটি "শেল" পিছনের দিকের কোমাপটিবল ক্লায়েন্টের বিরুদ্ধে এখন হ্রাস করা এপিআইয়ের জন্য একটি রিগ্রেশন পরীক্ষা চালানো নতুন এপিআই এবং সামঞ্জস্যতা স্তর উভয়ই পরীক্ষা করার একটি ভাল উপায়।

3

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

rest.product.com/api/v1/messages/send

ক্লায়েন্ট লাইব্রেরির জন্য আমি পৃথক জাভা প্যাকেজগুলিতে দুটি সম্পূর্ণ বাস্তবায়ন ব্যবহার করা পরিষ্কার, ব্যবহার করা সহজ এবং বজায় রাখা সহজ।

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

http://theamiableapi.com/2011/10/18/api-design-best-practice-plan-for-evolution/

বিশেষত REST এপিআই সংস্করণ করার জন্য, আপনি মার্ক নটিংহ্যামের এই পোস্টটি সহায়ক বলে খুঁজে পাবেন:

http://www.mnot.net/blog/2011/10/25/web_api_versioning_smackdown


3

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

POST /messages/list/{user} HTTP/1.1
Host: http://rest.service.com
Content-Type: application/json
API-Version: 1.0      <----- like here
Cache-Control: no-cache

আপনি শিরোনামকে পার্স করতে পারেন এবং ব্যাকএন্ডে এটি যথাযথভাবে পরিচালনা করতে পারেন।

এই পদ্ধতির সাথে ক্লায়েন্টদের ইউআরএল পরিবর্তন করার দরকার নেই, কেবল শিরোনাম। এবং এটিও সর্বদা, বিশ্রামের সমাপ্তিগুলি পরিষ্কার করে তোলে।

যদি ক্লায়েন্টের কোনও সংস্করণ শিরোলেখ না প্রেরণ করে, আপনি হয় 400 - খারাপ অনুরোধ প্রেরণ করেন বা আপনি এটি আপনার API এর পশ্চাদপটে-সামঞ্জস্যপূর্ণ সংস্করণ দিয়ে পরিচালনা করতে পারেন ।

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