কীভাবে REST ইউআরআই সংস্করণ করবেন


111

REST ইউআরআই সংস্করণ করার সর্বোত্তম উপায় কী? বর্তমানে আমাদের কাছে ইউআরআইতে একটি সংস্করণ রয়েছে, অর্থাৎ।

http://example.com/users/v4/1234/

এই উপস্থাপনা 4 সংস্করণ জন্য।

সংস্করণ কি ক্যোরিস্ট্রিংয়ের অন্তর্ভুক্ত? অর্থাত।

http://example.com/users/1234?version=4

অথবা সংস্করণটি অন্যভাবে কীভাবে সম্পাদিত হয়েছে?


উত্তর:


34

আমি বলব এটিকে নিজেই ইউআরআইর অংশ হিসাবে তৈরি করা (বিকল্প 1) সেরা কারণ ভি 4 ভি 3 এর চেয়ে আলাদা একটি উত্স চিহ্নিত করে। আপনার দ্বিতীয় বিকল্প মতো ক্যোয়ারী পরামিতি সেরা পাস-ইন করার জন্য অতিরিক্ত (কোয়েরি) এর সাথে সম্পর্কিত তথ্য ব্যবহার করা যেতে পারে অনুরোধ বদলে রিসোর্স


11
প্রশ্নটি হ'ল, আমরা আলোচনা করছি এটি কি অন্যরকম রিসোর্স? বা সেই উত্সটির আলাদা উপস্থাপনা? বিশ্রাম কী উপস্থাপনা এবং সংস্থানগুলির মধ্যে পার্থক্য তৈরি করে?
চিজো

1
@ শেইসো - ওপি ইঙ্গিত দেয় যে এটি ভিন্ন উত্সের চেয়ে আলাদা প্রতিনিধিত্ব, সুতরাং আমার উত্তর।
গ্রেগ বিচ


"আপনার দ্বিতীয় বিকল্পের মতো ক্যোয়ারী প্যারামিটারগুলির জন্য +1,
উত্সের

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

190

ইউআরএল সংস্করণ করবেন না, কারণ ...

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

ধরে নিই যে আপনার সংস্থানটি অ্যাপ্লিকেশন / vnd.yourcompany.user + xML এর কিছু বৈকল্পিক ফিরিয়ে দিচ্ছে আপনাকে কেবল নতুন অ্যাপ্লিকেশন / vnd.yourcompany.userV2 + xML মিডিয়া টাইপের জন্য সমর্থন তৈরি করতে হবে এবং বিষয়বস্তু আলোচনার যাদুতে আপনার ভি 1 এবং v2 ক্লায়েন্ট শান্তিপূর্ণভাবে সহ-বিদ্যমান থাকতে পারে।

একটি রিস্টফুল ইন্টারফেসে, আপনাকে চুক্তির নিকটতম জিনিসটি হ'ল ক্লায়েন্ট এবং সার্ভারের মধ্যে বিনিময় হওয়া মিডিয়া-প্রকারের সংজ্ঞা।

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

আপনার যদি এমন মিডিয়া-প্রকারে পরিবর্তন করতে হয় যা আপনার বিদ্যমান ক্লায়েন্টদের ভেঙে ফেলবে তবে একটি নতুন তৈরি করুন এবং আপনার ইউআরএলকে একা রেখে যান!

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


66
বুলেট পয়েন্টগুলি সম্বোধন করার জন্য। ১. আপনি পারমা লিঙ্কগুলি ভাঙবেন না, কারণ নির্দিষ্ট সংস্করণে পারমলিংকগুলি লিঙ্ক .. যদি সবকিছু সংস্করণ করা হয় তবে এটি কোনও সমস্যা নয়। পুরানো ইউআরএলগুলি এখনও কাজ করতে পারে। আদর্শভাবে, আপনি কোনও সংস্করণ 4 ইউআরএল চাইবেন না যে কোনও সংস্করণ 3 সংস্থানতে কোনও সংস্থান ফিরিয়ে আনবে। 3. সম্ভবত
মাইক পোনে

10
ভাবুন আপনি যদি কোনও ওয়েব ব্রাউজারের নতুন সংস্করণে আপগ্রেড হন, আপনার সমস্ত বুকমার্কড ফেভারিটগুলি ভেঙে গেছে! মনে রাখবেন যে ধারণাগতভাবে ব্যবহারকারী কোনও সংস্থার কোনও লিঙ্ক সংরক্ষণ করছে, কোনও উত্সের উপস্থাপনের সংস্করণে নয়।
ড্যারেল মিলার

11
@ গিলি একটি REST এপিআই-এর স্ব-বর্ণনামূলক হওয়ার প্রয়োজনীয়তা পূরণ করার জন্য বিষয়বস্তুর ধরণের শিরোনামটি ম্যাসেজটির সম্পূর্ণ শব্দার্থিক বিবরণ সরবরাহ করতে হবে। অন্য কথায়, আপনার মিডিয়া টাইপ হ'ল আপনার ডেটা চুক্তি। আপনি যদি অ্যাপ্লিকেশন / এক্সএমএল বা অ্যাপ্লিকেশন / জসন বিতরণ করেন তবে আপনি ক্লায়েন্টকে X এক্সএমএল / জসন-তে কী রয়েছে সে সম্পর্কে কিছুই বলছেন না। ক্লায়েন্ট অ্যাপ্লিকেশনটি যে বার্তাটি পৌঁছেছে তা তাত্ক্ষণিকভাবে / গ্রাহক / নাম আপনি সংযোগ তৈরি করছেন যা বার্তায় নেই এমন তথ্যের উপর ভিত্তি করে তৈরি করা হয়েছে। আউট-অফ-ব্যান্ড কাপলিং অপসারণ RESTfulness অর্জনের জন্য গুরুত্বপূর্ণ।
ড্যারেল মিলার

6
@ গিলি ক্লায়েন্টের মূল URL ব্যতীত এপিআইএল এর URL গুলি সম্পর্কে পূর্বের জ্ঞান থাকা উচিত নয়। আপনার নির্দিষ্ট ইউআরএলে উপস্থাপনের ফর্ম্যাটগুলি বেঁধে রাখা উচিত নয়। মিডিয়া-টাইপগুলি বেছে নেওয়ার ক্ষেত্রে আপনার অ্যাপ্লিকেশন / vnd.mycompany.myformat + এক্সএমএল বা একটি মানকযুক্ত যেমন, এক্সএইচটিএমএল, অ্যাটম, আরডিএফ ইত্যাদি ইত্যাদির মধ্যে সত্যই চয়ন করতে হবে
ড্যারেল মিলার

4
এপিআই সংস্করণটি আলাদা শিরোনামের ক্ষেত্র হিসাবে রাখার অর্থ কী? ভালো লেগেছে: গ্রহণ করুন: প্রয়োগ / com.example.myapp + json; সংস্করণ = 1.0
এরিক

21

আহ, আমি আবার আমার পুরানো কুঁচকানো টুপি লাগিয়ে দিচ্ছি।

একটি আরএসটি দৃষ্টিকোণ থেকে, এটি মোটেও গুরুত্বপূর্ণ নয়। সসেজ নয়।

ক্লায়েন্টটি একটি ইউআরআই পায় যা এটি অনুসরণ করতে চায় এবং এটিকে অস্বচ্ছ স্ট্রিং হিসাবে ধরে। এতে আপনি যা চান তা রাখুন, ক্লায়েন্টের কাছে এটির কোনও সংস্করণ সনাক্তকারী হিসাবে কোনও জিনিস নেই।

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

তবে যে কোনও উপায়ে ক্লায়েন্ট কেবল কোনও দস্তাবেজটিকে এটি বুঝতে পারে এমন ফর্ম্যাট সহ প্রক্রিয়া করতে পারে এবং এতে লিঙ্কগুলি অনুসরণ করতে পারে। লিঙ্ক সম্পর্কগুলি (রূপান্তরগুলি) সম্পর্কে এটি জানা উচিত। সুতরাং ইউআরআইতে যা আছে তা সম্পূর্ণ অপ্রাসঙ্গিক।

আমি ব্যক্তিগতভাবে http: // লোকালহোস্ট / 3f3405d5-5984-4683-bf26-aca186d21c04 এর পক্ষে ভোট দেব

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


যদি উপস্থাপনাটির উল্লেখযোগ্যভাবে পরিবর্তন হওয়া দরকার এবং পিছনের দিকে সামঞ্জস্যপূর্ণ না হয় তবে কী হবে?
মাইক পোনে

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

1
আমি এই সম্পূর্ণ বৈধ উত্তরটি পছন্দ করি তবে আমি মনে করি প্রস্তাবিত ইউআরআই এমন একটি বাস্তব দৃশ্যের তুলনায় বিন্দুটি প্রদর্শন করা বেশি যা আপনি 'হ্যাকযোগ্য' ইউআরআই চান না।
ডেভ ভ্যান ডেন এ্যান্ডে

10

আপনার ইউআরএলটিতে সংস্করণটি রাখা উচিত নয়, আপনার অনুরোধের স্বীকৃতি শিরোনামে সংস্করণটি রাখা উচিত - এই থ্রেডটিতে আমার পোস্টটি দেখুন:

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

আপনি যদি ইউআরএলটিতে সংস্করণগুলি স্টিক করা শুরু করেন তবে আপনি এর মতো মূর্খ ইউআরএলগুলি দিয়ে শেষ করবেন: http://company.com/api/v3.0/customer/123/v2.0/orders/4321/

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


11
দুঃখিত, তবে আমি মনে করি না আপনি এর মতো মূর্খ URL গুলো শেষ করেছেন। আপনি কোনও নির্দিষ্ট উত্স বা সংস্করণ নম্বরগুলি কোনও নির্দিষ্ট উপস্থাপনায় বাঁধছেন। এটি নির্বোধ হবে, আইএমও। বরং আপনি এপিআই সংস্করণ করছেন, তাই ইউআরআইতে আপনার একাধিক সংস্করণ কখনও থাকবে না।
বোকা


3

এপিআই সংস্করণ করার জন্য 4 টি পৃথক পদ্ধতি রয়েছে:

  • ইউআরআই পথে সংস্করণ যুক্ত করা হচ্ছে:

    http://example.com/api/v1/foo
    
    http://example.com/api/v2/foo
    

    যখন আপনার ব্রেকিং পরিবর্তন হবে, আপনার অবশ্যই সংস্করণটি বাড়িয়ে তুলবেন: ভি 1, ভি 2, ভি 3 ...

    আপনি আপনার কোডটিতে এইভাবে একটি নিয়ামক প্রয়োগ করতে পারেন:

    @RestController
    public class FooVersioningController {
    
    @GetMapping("v1/foo")
    public FooV1 fooV1() {
        return new FooV1("firstname lastname");
    }
    
    @GetMapping("v2/foo")
    public FooV2 fooV2() {
        return new FooV2(new Name("firstname", "lastname"));
    }
    
  • প্যারামিটার সংস্করণ অনুরোধ:

    http://example.com/api/v2/foo/param?version=1
    http://example.com/api/v2/foo/param?version=2
    

    সংস্করণ প্যারামিটারটি আপনি কীভাবে API ব্যবহার করতে চান তার উপর নির্ভর করে alচ্ছিক বা প্রয়োজনীয় হতে পারে।

    বাস্তবায়ন এর অনুরূপ হতে পারে:

    @GetMapping(value = "/foo/param", params = "version=1")
    public FooV1 paramV1() {
        return new FooV1("firstname lastname");
    }
    
    @GetMapping(value = "/foo/param", params = "version=2")
    public FooV2 paramV2() {
        return new FooV2(new Name("firstname", "lastname"));
    }
    
  • একটি কাস্টম শিরোলেখ পাস করা:

    http://localhost:8080/foo/produces
    

    শিরোনাম সহ:

    headers[Accept=application/vnd.company.app-v1+json]
    

    বা:

    headers[Accept=application/vnd.company.app-v2+json]
    

    এই স্কিমের বৃহত্তম সুবিধা হ'ল বেশিরভাগ শব্দার্থবিজ্ঞান: আপনি ইউআরআই-কে সংস্করণে কিছু করার জন্য নড়বড় করছেন না।

    সম্ভাব্য বাস্তবায়ন:

    @GetMapping(value = "/foo/produces", produces = "application/vnd.company.app-v1+json")
    public FooV1 producesV1() {
        return new FooV1("firstname lastname");
    }
    
    @GetMapping(value = "/foo/produces", produces = "application/vnd.company.app-v2+json")
    public FooV2 producesV2() {
        return new FooV2(new Name("firstname", "lastname"));
    }
    
  • হোস্ট-নেম পরিবর্তন করা বা এপিআই গেটওয়ে ব্যবহার করে:

    মূলত, আপনি একটি হোস্টনাম থেকে অন্য হোস্টনামে API এ চলেছেন। আপনি এমনকি এই বিল্ডিংটিকে একই সংস্থানগুলিতে একটি নতুন এপিআই কল করতে পারেন।

    এছাড়াও, আপনি এপিআই গেটওয়ে ব্যবহার করে এটি করতে পারেন।


2

যদি আরইএসটি পরিষেবাগুলিকে ব্যবহারের আগে প্রমাণীকরণের প্রয়োজন হয় তবে আপনি সহজেই এপিআই কী / টোকেনকে একটি এপিআই সংস্করণের সাথে সংযুক্ত করতে পারেন এবং অভ্যন্তরীণভাবে রাউটিংটি করতে পারেন। এপিআই-র একটি নতুন সংস্করণ ব্যবহার করতে, নতুন সংস্করণটির সাথে লিঙ্ক করা একটি নতুন এপিআই কী প্রয়োজন হতে পারে।

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


2

আমি সংস্করণযুক্ত এপিআই তৈরি করতে চেয়েছিলাম এবং আমি এই নিবন্ধটি খুব দরকারী:

http://blog.steveklabnik.com/posts/2011-07-03-nobody-understands-rest-or-http

"আমি চাই আমার এপিআই সংস্করণ করা হোক" এর একটি ছোট্ট বিভাগ রয়েছে। আমি এটি সহজ এবং বুঝতে সহজ পেয়েছি। সংস্করণ তথ্য পাস করার জন্য শিরোনামটিতে গ্রহনযোগ্য ক্ষেত্রটি গ্রহণ করতে হবে cru


1

আমি ইউআরআইয়ের শেষে সংস্করণটিকে একটি alচ্ছিক মান হিসাবে অন্তর্ভুক্ত করব। এটি / V4 এর মতো প্রত্যয় বা আপনার বর্ণনার মতো ক্যোয়ারী প্যারামিটার হতে পারে। আপনি কোয়েরি প্যারামিটারে / V4 পুনর্নির্দেশ করতে পারেন যাতে আপনি উভয় প্রকারের সমর্থন করে support


1

আপনি যদি সংস্করণটির জন্য ইউআরআই ব্যবহার করেন তবে সংস্করণ নম্বরটি API এর মূলের ইউআরআইতে হওয়া উচিত, সুতরাং প্রতিটি সংস্থান সনাক্তকারী এটি অন্তর্ভুক্ত করতে পারে।

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

কাস্টম এমআইএমআইএম টাইপ এবং এমআইএমএম টাইপ সংস্করণ সাহায্য করে না, কারণ সম্পর্কিত মেটাডেটা এবং উপস্থাপনার কাঠামোটিকে একটি সংক্ষিপ্ত স্ট্রিংয়ে রাখলে কাজ হয় না। তথ্যের। মেটাডেটা এবং কাঠামোটি প্রায়শই পরিবর্তিত হবে এবং তাই সংস্করণ সংখ্যাটিও ...

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


0

আমি মাইম টাইপে এটি করার জন্য ভোট দিয়েছি তবে ইউআরএলে নয়। তবে কারণ অন্যান্য ছেলেদের মতো নয়।

আমি মনে করি অনন্য সংস্থান চিহ্নিত করার জন্য ইউআরএলটি অনন্য (সেই পুনর্নির্দেশগুলি বাদে) হওয়া উচিত। সুতরাং, যদি আপনি গ্রহণ /v2.0URL গুলিতে, কেন তা না হয় /ver2.0বা /v2/বা /v2.0.0? বা এমনকি -alphaএবং -beta? (তারপরে এটি সম্পূর্ণভাবে সেমভারের ধারণায় পরিণত হয় )

সুতরাং, মাইম টাইপের সংস্করণটি ইউআরএল থেকে বেশি গ্রহণযোগ্য।

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