এপিআই সংস্করণ জন্য সেরা অনুশীলন? [বন্ধ]


877

ওয়েব পরিষেবা REST এপিআই সংস্করণটির জন্য কী কী টোস বা সেরা অনুশীলন রয়েছে?

আমি লক্ষ্য করেছি যে এডাব্লুএস শেষের পয়েন্টের ইউআরএল দ্বারা সংস্করণ করে । এটি কি একমাত্র উপায় বা একই লক্ষ্য অর্জনের অন্যান্য উপায় আছে? যদি একাধিক উপায় থাকে তবে প্রতিটি উপায়ে কী কী গুণ রয়েছে?

উত্তর:


682

এটি একটি ভাল এবং একটি জটিল প্রশ্ন। ইউআরআই ডিজাইনের বিষয় একই সাথে একটি আরএসটি এপিআইয়ের সর্বাধিক বিশিষ্ট অংশ এবং অতএব, সেই এপিআইর ব্যবহারকারীর প্রতি সম্ভাব্য দীর্ঘমেয়াদী প্রতিশ্রুতি

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

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

সময়ের সাথে সাথে আপনার প্রতিটি নির্দিষ্ট সংস্থানটিতে নতুন সংস্থান এবং নতুন বৈশিষ্ট্য যুক্ত করার প্রয়োজন হতে পারে, তবে এপিআই ব্যবহারকারীরা কোনও নির্দিষ্ট সংস্থান অ্যাক্সেস করার জন্য যে পদ্ধতি অনুসরণ করে তা কোনও বার রিসোর্স অ্যাড্রেসিং স্কিমটি সর্বজনীন হয়ে ওঠে এবং তাই চূড়ান্ত হয়ে যায় change

এই পদ্ধতিটি HTTP ক্রিয়া শব্দার্থবিজ্ঞানের ক্ষেত্রে প্রযোজ্য (উদাহরণস্বরূপ PUT সর্বদা আপডেট / প্রতিস্থাপন করা উচিত) এবং HTTP স্থিতি কোডগুলি যা পূর্ববর্তী API সংস্করণগুলিতে সমর্থিত (তাদের কাজ চালিয়ে যাওয়া উচিত যাতে মানবিক হস্তক্ষেপ ছাড়াই কাজ করা এপিআই ক্লায়েন্টরা কাজ চালিয়ে যেতে সক্ষম হয়) সে রকমই).

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

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

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

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

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

তবে, ইউআরআই-তে স্পষ্টভাবে দৃশ্যমান এপিআই সংস্করণগুলির সাথে একটি সতর্কতা অবলম্বন করা যেতে পারে: ইউআরআই নকশায় এপিআই ইতিহাস দৃশ্যমান / স্পষ্ট হয়ে ওঠে এবং তাই সময়ের সাথে সাথে পরিবর্তনগুলি ঝুঁকির মধ্যে পড়ে যা আরআরইএসটির নির্দেশিকাগুলির বিপরীতে থাকে। আমি রাজী!

এই যুক্তিসঙ্গত আপত্তির চারপাশে যাওয়ার উপায়টি হ'ল ভার্সনবিহীন এপিআই বেস ইউআরআই এর আওতায় সর্বশেষতম এপিআই সংস্করণটি প্রয়োগ করা। এই ক্ষেত্রে, এপিআই ক্লায়েন্ট বিকাশকারীরা যেকোনটি বেছে নিতে পারেন:

  • সর্বশেষতমটির বিরুদ্ধে বিকাশ করুন (অ্যাপ্লিকেশনটিকে এটির শেষ রক্ষণাবেক্ষণের পরিবর্তিত এপিআই ক্লায়েন্টকে ভেঙে ফেলতে পারে এমন এপিআই পরিবর্তনগুলি থেকে রক্ষা করার জন্য তাদের প্রতিশ্রুতিবদ্ধ )।

  • এপিআই-র একটি নির্দিষ্ট সংস্করণে আবদ্ধ (যা স্পষ্ট হয়ে ওঠে) তবে কেবল সীমিত সময়ের জন্য

উদাহরণস্বরূপ, যদি API v3.0 সর্বশেষতম এপিআই সংস্করণ হয় তবে নিম্নলিখিত দুটিটি অবশ্যই এলিয়াস হওয়া উচিত (যেমন সমস্ত API অনুরোধের সাথে অভিন্ন আচরণ করুন):

http: // শনজিলা / এপিআই / গ্রাহকরা / 1234 
http: // শনজিলা / এপিআই / ভি 3.0 / গ্রাহক / 1234
http: // শনজিলা / এপিআই / ভি 3 / গ্রাহক / 1234

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

http: // শনজিলা / এপিআই / ভি 2.2 / গ্রাহক / 1234
http: // শনজিলা / এপিআই /ভি 2.0 / গ্রাহক / 1234
http: // শনজিলা / এপিআই / ভি 2 / গ্রাহক / 1234
http: // শনজিলা / এপিআই / ভি 1.1 / গ্রাহক / 1234
http: // শনজিলা / এপিআই / ভি 1 / গ্রাহক / 1234

এইচটিটিপি শিরোলেখের সাথে একত্রে ব্যবহৃত পুনঃনির্দেশ নির্দেশিত 30x এইচটিটিপি স্থিতি কোডগুলির মধ্যে কোনওটি ফিরিয়ে দেওয়া উচিত যা এই ইউটিও হিসাবেLocation রয়ে গেছে এমন উত্সের যথাযথ সংস্করণে পুনঃনির্দেশ করে:

HTTP: // shonzilla / API / গ্রাহকদের / 1234

কমপক্ষে দুটি পুনর্নির্দেশ HTTP স্থিতি কোড রয়েছে যা এপিআই সংস্করণ সংস্করণের জন্য উপযুক্ত:

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

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

  • অন্যান্য পরিস্থিতিতে HTTP 1.1 নির্দিষ্টকরণের পুনর্নির্দেশ 3xx অধ্যায় পাওয়া যাবে


142
অন্তর্নিহিত বাস্তবায়ন পরিবর্তিত হলে URL এ সংস্করণ নম্বর ব্যবহার করা খারাপ অভ্যাস হিসাবে বিবেচিত হবে না। "যখন কোনও পরিষেবাদির ইন্টারফেসটি একটি অন-পিছনে-সামঞ্জস্যপূর্ণ উপায়ে পরিবর্তিত হয়, বাস্তবে একটি সম্পূর্ণ নতুন পরিষেবা তৈরি করা হয় ... ক্লায়েন্টের দৃষ্টিকোণ থেকে, কোনও পরিষেবা কোনও ইন্টারফেস এবং কিছু অ-কার্যকরী গুণাবলীর বাইরে থাকে না .. .আর যদি কোনও পরিষেবার ইন্টারফেসটি একটি নন-ব্যাকওয়ার্ড-সামঞ্জস্যপূর্ণ উপায়ে পরিবর্তিত হয়, তবে এটি আর মূল পরিষেবাটির উদাহরণ উপস্থাপন করে না, বরং সম্পূর্ণ নতুন পরিষেবা। " আইবিএম.com
ডেভেলপ

7
সংস্করণ নম্বর সহ একটি শিরোনাম যুক্ত করার বিষয়ে আপনার কি কোনও ধারণা আছে যাতে এটি ক্লায়েন্ট বা বিকাশকারীগণ দ্বারা পরীক্ষা করা যায়?
ওয়েবক্লাইবার

11
ক্লায়েন্টটি যে সংস্করণটি প্রত্যাশা করে তার সংস্করণটি নির্দেশ করতে একটি স্বীকার করুন শিরোনামের ব্যবহারটিও দেখুন: ব্লগ.স্টেভ্ল্যাব্লিক.কম
ওয়েস্টন রাউটার

52
শেষ অংশের জন্য: আমি বলব যে একটি এমন এপিআই যা অপ্রচলিত এবং আর সমর্থিত নয় সেগুলি ফিরে আসা উচিত 410 Gone, কারণ পুনর্নির্দেশের ফলে ইঙ্গিত হতে পারে যে নতুন অবস্থানটি যখন তা নয় তখন উপযুক্ত is যদি API নিছক অপ্রচলিত থাকে তবে এখনও বিদ্যমান থাকে Warningতবে প্রতিক্রিয়াতে একটি HTTP শিরোনাম বিকল্প হতে পারে।
মাইকেল স্টাম

22
ইতিমধ্যে shonzilla / api / গ্রাহকরা / 1234 এর মতো স্থিতিশীল URL ব্যবহার করা ক্লায়েন্টদের সাথে আপনি কীভাবে আচরণ করবেন এবং আপনি একটি নতুন সংস্করণে আপগ্রেড করতে চান? আপনি কীভাবে তাদের ইউআরএলটিতে ভি 2 (পুরানো) যুক্ত করতে পারেন?
ডিজেল

273

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

সংস্করণগুলি রয়েছে এমন ইউআরএলগুলির জন্য যদি আপনি সম্পূর্ণ এইচটিটিপি অনুরোধটি দেখেন তবে এটি এমন দেখাচ্ছে:

(BAD WAY TO DO IT):

http://company.com/api/v3.0/customer/123
====>
GET v3.0/customer/123 HTTP/1.1
Accept: application/xml

<====
HTTP/1.1 200 OK
Content-Type: application/xml
<customer version="3.0">
  <name>Neil Armstrong</name>
</customer>

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

একটি ভাল উপায় হ'ল:

(GOOD WAY TO DO IT)

http://company.com/api/customer/123
===>
GET /customer/123 HTTP/1.1
Accept: application/vnd.company.myapp.customer-v3+xml

<===
HTTP/1.1 200 OK
Content-Type: application/vnd.company.myapp-v3+xml
<customer>
  <name>Neil Armstrong</name>
</customer>

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

(BAD)
http://company.com/api/JSONv3.0/customers/123
  or
http://company.com/api/v3.0/customers/123?format="JSON"

(বা অনুরূপ কিছু)। বাস্তবে, প্রতিটি এইচটিটিপি অনুরোধে আপনি যে বিন্যাসটি সন্ধান করছেন তা ধারণ করে:

(GOOD WAY TO DO IT)
===>
GET /customer/123 HTTP/1.1
Accept: application/vnd.company.myapp.customer-v3+json

<===
HTTP/1.1 200 OK
Content-Type: application/vnd.company.myapp-v3+json

{"customer":
  {"name":"Neil Armstrong"}
}

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

অন্যান্য অনেক সুবিধা আছে এবং আমি আমার ব্লগে এখানে তাদের কিছু আলোচনা: http://thereisnorightway.blogspot.com/2011/02/versioning-and-types-in-resthttp-api.html

ইউআরএলটিতে সংস্করণটি রাখা কীভাবে খারাপ তা দেখানোর একটি শেষ উদাহরণ। বলুন যে আপনি অবজেক্টের অভ্যন্তরে কিছু তথ্য চান এবং আপনি আপনার বিভিন্ন বস্তুর সংস্করণ করেছেন (গ্রাহকরা v3.0, অর্ডারগুলি v2.0, এবং শিপ্টো অবজেক্টটি v4.2)। এখানে ক্লায়েন্টে সরবরাহ করা অবশ্যই বাজে ইউআরএল:

(Another reason why version in the URL sucks)
http://company.com/api/v3.0/customer/123/v2.0/orders/4321/

10
স্বীকৃতি শিরোনামে স্বতন্ত্র ডেটা চুক্তি সংস্করণ এবং পরিষেবা চুক্তির সংস্করণগুলি হ্যান্ডলিং করা ইউআরএলটিতে যত অগোছালো তা অগোছালো বলে মনে হয়। অন্য কোন বিকল্প আছে? এছাড়াও যদি আমার একাধিক এন্ডপয়েন্টস (সাবান, বিশ্রাম) থাকে তবে এটিকেও গ্রহণগুলিতে ইঙ্গিত করা উচিত এবং সার্ভারের শেষে রাউটিং পরিষেবাটি সঠিক শেষ পয়েন্টের দিকনির্দেশটি নির্ধারণ করতে দেয় বা URL এ শেষ পয়েন্টটি কোড করা কি গ্রহণযোগ্য?
আদর্শফ্রন্ট

117
আমি এটির সাথে একমত হতে পারি না, কমপক্ষে আপনার শেষ কারণটির কারণ হিসাবে। এটি ইউআরআইয়ের বিভিন্ন অংশের বিভিন্ন সংস্করণ বলে বলে মনে হচ্ছে। তবে এটি কোনও এপিআই সংস্করণের মূল বিষয় নয়। মূল সম্পদটির জন্য এক সংস্করণ থাকা উচিত। আপনি যদি সংস্করণগুলি পরিবর্তন করেন তবে এটি একটি আলাদা এপিআই উত্স। এজন্য কোম্পানী. com/api/v3.0/customer/123/v2.0/orders/4321 বরং কোম্পানী. com/api/v3.0/ কাস্টমার / 123 / সীমানা / 4321 দেখতে বুদ্ধিমান হয় না আপনি সংস্থানটির যে কোনও অংশের সংস্করণ করছেন না, আপনি সামগ্রিকভাবে সংস্থানটির সংস্করণ করছেন।
বোকা

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

7
আমি মনে করি বিএডি / ভাল প্রশ্নটি সহজতর করে। এপিআই মানে "অ্যাপ্লিকেশন প্রোগ্রামিং ইন্টারফেস" এবং সংস্করণ ইন্টারফেসটি খুব ভাল ধারণা বলে মনে হচ্ছে। API গুলি কেবলমাত্র পরিসেবা সরবরাহ সম্পর্কে নয়। যা আলাদা করার দরকার তা হ'ল কিছু লোক ইন্টারফেসের বিষয়ে কথা বলছে এবং অন্যান্য লোকেরা সম্পদ সম্পর্কে কথা বলছে। আপনি যদি গুগল ম্যাপস এপিআইটিকে নেটওয়ার্ক ট্যাবে ঘনিষ্ঠভাবে দেখেন তবে আপনি দেখতে পাবেন যে এগুলি ইউআরএল এপিআই সংস্করণ নম্বর অন্তর্ভুক্ত করে। উদাহরণস্বরূপ: প্রমাণীকরণের সময় map.google.com/maps/api/jsv2। Jsv2 হ'ল এপি নম্বর।
টম গ্রুনার

6
@ গিলি: আসলে, আরএফসি 6648-x দ্বারা এটি অবনমিত হিসাবে আপনার আর ব্যবহার করা উচিত নয় ।
জোনাথন ডাব্লু

98

ইউআরএলটিতে সংস্করণটি রাখার জন্য আমরা এটি ব্যবহারিক এবং দরকারী বলে মনে করেছি। আপনি কী এক নজরে ব্যবহার করছেন তা বলা সহজ করে তোলে। গ্রহণযোগ্য উত্তরের পরামর্শ অনুসারে আমরা ব্যবহারের স্বাচ্ছন্দ্য, সংক্ষিপ্ত / ক্লিনার ইউআরএল ইত্যাদির জন্য عرف / ফু থেকে / ফু / (সর্বশেষ সংস্করণ) করি।

পিছনে সামঞ্জস্যতা চিরকাল ধরে রাখা প্রায়শই ব্যয়-প্রতিরোধমূলক এবং / অথবা খুব কঠিন। আমরা অবচয়, উন্নত নোটিশ দেওয়া এখানে প্রস্তাবিত মত পুনঃনির্দেশ, ডকস এবং অন্যান্য প্রক্রিয়া দিতে পছন্দ করি।


5
গৃহীত উত্তর সঠিক এবং সবচেয়ে খাঁটি হতে পারে। তবে, বিকাশকারীর জন্য এবং এপিআই-র প্রতিদিন ব্যবহারকারীর পক্ষে এটি অবশ্যই ব্যবহার এবং সেটআপ করা সহজ। সবচেয়ে বাস্তববাদী পদ্ধতির। অন্যান্য গুগল এবং অ্যামাজন দ্বারা নির্দেশিত হিসাবে এই পদ্ধতির ব্যবহার।
মুহাম্মদ রেহান সা Saeedদ

46

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

উদাহরণস্বরূপ, কোনও সংস্থান তৈরি করার জন্য, এইচটিএমএল 5 ফর্মগুলিতে নিম্নলিখিত শিরোনামগুলি সহ পোষ্ট করা IMO সম্ভব নয়:

Accept: application/vnd.company.myapp-v3+json
Content-Type: application/vnd.company.myapp-v3+json 

এটি এইচটিএমএল 5 enctypeবৈশিষ্ট্যটি একটি গণনা, তাই সাধারণ ব্যতীত অন্য কিছু application/x-www-formurlencoded, multipart/form-dataএবং text/plainঅবৈধ।

... এবং আমিও নিশ্চিত নই যে এটি HTML4- এ সমস্ত ব্রাউজার জুড়ে সমর্থিত (এতে আরও বেশি শিথিল এনসাইটিপ বৈশিষ্ট্য রয়েছে, তবে এমআইএমআই টাইপটি ফরোয়ার্ড করা হয়েছে কিনা তা ব্রাউজার বাস্তবায়ন সমস্যা হবে)

এ কারণে আমি এখন অনুভব করি সংস্করণটির সবচেয়ে উপযুক্ত উপায়টি ইউআরআইয়ের মাধ্যমে, তবে আমি স্বীকার করি যে এটি 'সঠিক' উপায় নয়।


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

আমি নিশ্চিত নই যে আমি সম্মত হলাম যে ইউআরআই সর্বাধিক উপযুক্ত, তবে বিষয়বস্তু-টাইপ ফর্মগুলির সাথে কাজ করে না তা আসলেই খুব গুরুত্বপূর্ণ।
wprl

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

এটি আসলে আমার কাছে এখন অনেক চিন্তাভাবনা করে যা আমি ভাবছি।
কাইল হেইস

@ কাইলহয়েস আইফ্রেমেস, ভিডিও / এম্বেড এবং অন্যান্য "এসসিআর / href" টাইপ ট্যাগগুলি ভুলে যাবেন না।
প্লিজ

21

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

সংস্করণগুলি সম্পদ ঠিকানার অংশ। আপনি একটি এপিআই থেকে অন্য এপিআইতে রাউটিং করছেন। শিরোনামে ঠিকানাটি লুকিয়ে রাখা ঠিক নয়।


13

একটি REST এপিআইতে সংস্করণ করা যায় এমন কয়েকটি জায়গা রয়েছে:

  1. যেমনটি উল্লেখ করা হয়েছে, ইউআরআই-তে পুনঃনির্দেশগুলি এবং এর মতো ভালভাবে ব্যবহার করা গেলে এটি ট্র্যাকটেবল এবং এমনকি জাঁকজমকপূর্ণও হতে পারে।

  2. গ্রহণগুলি: শিরোনামে, সুতরাং সংস্করণটি ফাইল টাইপের মধ্যে রয়েছে। 'এমপি 3' বনাম 'এমপি 4' এর মতো। এটিও কাজ করবে, যদিও আইএমও এটির চেয়ে কিছুটা কম সুন্দর কাজ করে ...

  3. রিসোর্সে নিজেই। অনেকগুলি ফাইল ফর্ম্যাটগুলিতে তাদের সংস্করণ নম্বর এম্বেড থাকে, সাধারণত শিরোনামে; এটি নতুন সফ্টওয়্যারকে ফাইল টাইপের সমস্ত বিদ্যমান সংস্করণগুলি বোঝার দ্বারা 'স্রেফ কাজ' করতে দেয় যখন কোনও অসমর্থিত (নতুন) সংস্করণ নির্দিষ্ট করা থাকলে পুরানো সফ্টওয়্যার পন্ট করতে পারে। একটি REST এপিআই প্রসঙ্গে, এর অর্থ হল যে আপনার ইউআরআইগুলিকে কখনই পরিবর্তন করতে হবে না, কেবলমাত্র আপনাকে দেওয়া ডেটাটির নির্দিষ্ট সংস্করণে আপনার প্রতিক্রিয়া।

আমি তিনটি পদ্ধতির ব্যবহারের কারণ দেখতে পাচ্ছি:

  1. আপনি যদি 'ক্লিন সুইপ' নতুন এপিআই করতে চান বা বড় সংস্করণে পরিবর্তনের জন্য যেখানে আপনি এই জাতীয় দৃষ্টিভঙ্গি চান।
  2. আপনি যদি ক্লায়েন্টটি PUT / POST করার আগে এটি জানতে চান যে এটি কাজ করছে কি না।
  3. যদি এটি ঠিক আছে যদি ক্লায়েন্টটি কাজ করছে কিনা তা জানতে তার পুট / পোস্ট করতে হবে।

8

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

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

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