একটি REST এপিআই কি একক যৌগিক সংস্থান হিসাবে একাধিক সংস্থান ফিরিয়ে দিতে পারে?


10

আমি একটি REST এপিআই তৈরির প্রগতিতে রয়েছি এবং বর্তমানে আমি নিম্নলিখিত সমস্যার মুখোমুখি হয়েছি:

  • Fooপ্রথম সম্পদ। CRUD অপারেশনগুলি এর মাধ্যমে প্রয়োগ করা যেতে পারে/foo/
  • Barদ্বিতীয় সম্পদ। CRUD অপারেশনগুলি এর মাধ্যমে প্রয়োগ করা যেতে পারে/bar/
  • প্রত্যেকটি Fooশূন্য বা একটির সাথে যুক্ত Bar। আমি কেন Barএকটি সাবসোর্স হিসাবে বিবেচনা করি না Fooকারণ একই Barউদাহরণটি একাধিক এর মধ্যে ভাগ করা যায় Foo। সুতরাং আমি অনুভব করেছি যে এটির পরিবর্তে একটি স্বতন্ত্র ইউআরআইয়ের মাধ্যমে এটি অ্যাক্সেস করা ভাল /foo/[id]/bar

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

  • আমি একটি ক্যোয়ারী পরামিতি এই অনুরূপ পরিচয় করিয়ে পারে: /foo/[id]?include_bar=true। এই পদ্ধতির সমস্যাটি হ'ল প্রতিক্রিয়াটির রিসোর্স রিপ্রেজেন্টেশন (যেমন জেএসএন কাঠামো) দেখতে আলাদা দেখতে হবে (যেমন { foo: ..., bar: ... }কেবল একটি সিরিয়ালযুক্ত পরিবর্তে একটি ধারক Foo), যা Fooসংস্থানটির শেষ দিকটিকে "ভিন্নধারা" করে তোলে । আমি মনে করি না এটি একটি ভাল জিনিস। জিজ্ঞাসা যখন/foo , ক্লায়েন্টদের কোয়েরি পরামিতি নির্বিশেষে সর্বদা একই উত্স উপস্থাপনা (কাঠামো) পাওয়া উচিত।
  • আরেকটি ধারণা হ'ল একটি নতুন পঠনযোগ্য শেষ পয়েন্ট উপস্থাপন করা, যেমন /fooandbar/[foo-id]। এই ক্ষেত্রে, কোনও প্রতিনিধিত্বের মতো ফিরিয়ে { foo: ..., bar: ... }আনার কোনও সমস্যা নেই , কারণ এটি কেবলমাত্র উত্সটির "আধিকারিক" প্রতিনিধিত্ব fooandbarকরে। তবে, আমি জানি না যে এইরকম সহায়ক সহায়ক পয়েন্টটি আসলেই বিশ্রামযুক্ত কিনা (এ কারণেই আমি প্রশ্নের শিরোনামে "পারি" লিখেছিলাম। অবশ্যই এটি প্রযুক্তিগতভাবে সম্ভব, তবে আমি জানি না এটি ভাল ধারণা কিনা)।

আপনি কি মনে করেন? অন্য কোন সম্ভাবনা আছে?


ফু ও বারের সম্পর্কের শব্দটি কী? আপনি কি বলতে পারেন যে বার ফু এর পিতামাতা?
নাথান মেরিল

ক এর Barসাথে যুক্ত না হয়ে থাকতে পারে না Foo। যাইহোক, আমি উপরে লিখেছি, এটি একাধিক Fooগুলি একই ভাগ করা সম্ভব BarFooকোনও Barযুক্ত ছাড়া কোনও তৈরি করা সম্ভব হওয়া উচিত , তাই আমি মনে করি না যে Barপিতামাতার মতো আচরণ করা উচিত।
ceran

1
আমার মনে হয় আপনি সরাসরি ডোমেন মডেল সম্পর্কের ইউআরআইতে অনুবাদ করে এবং ডোমেন সত্তার সাথে সংস্থানগুলি সংস্থান করে আমার কিছু সমস্যার সম্মুখীন হচ্ছেন । এটি আগ্রহী হতে পারে REST এপিআইগুলিকে হাইপারটেক্সট-চালিত । চতুর্থ
দফায়

উত্তর:


6

একটি স্তর 3 টি আরএসটি এপিআই আপনাকে Fooসম্পর্কিত এবং একটি লিঙ্কও ফেরত দেবে Bar

GET /foo/123
<foo id="123">
  ..foo stuff..
  <link rel="bar" uri="/bar/456"/>
</foo>

এরপরে আপনি আপনার এপিআইতে একটি "ড্রিল ডাউন" বৈশিষ্ট্য যুক্ত করতে পারেন যা লিঙ্কগুলির নেভিগেশনের অনুমতি দেয়;

GET /foo/123?drilldown=bar
<foo id="123">
  ..foo stuff..
  <link rel="bar" uri="/bar/456">
    <bar id="456">
      ..bar stuff...
    </bar>
  </link>
</foo>

ড্রিল ডাউন বৈশিষ্ট্যটি এপিআইগুলির সামনে বসে এবং প্রতিক্রিয়াগুলিকে বাধা দেয়। এটি কলটি কল করে এবং কলটিকে প্রতিক্রিয়া ফিরিয়ে দেওয়ার আগে বিশদটি পূরণ করবে।

এটি 3 আরএসটি স্তরের একটি খুব সাধারণ জিনিস কারণ এটি ধীর http- এর চেয়ে ক্লায়েন্ট / সার্ভারের চাট্টিখাকে কমিয়ে দেয়। আমি যে সংস্থার জন্য কাজ করি সেগুলি এই বৈশিষ্ট্যটির সাথে একটি স্তর 3 টি REST এপিআই উত্পাদন করে।

আপডেট: এর মূল্য কী, এটি JSON এ কেমন লাগবে তা এখানে। আমাদের এপিআই এটির কাঠামোটি এইভাবে করে। নোট করুন যে আপনি লিঙ্কগুলির লিঙ্কগুলি টানতে আপনার ড্রিল ডাউনগুলি বাসা করতে পারেন ইত্যাদি etc.

GET /foo/123?drilldown=bar

{
  "self": {
    "type": "thing.foo",
    "uri": "/foo/123=?drilldown=bar",
    "href": "http://localhost/api/foo/123?drilldown=bar"
  },
  "links": [
    {
      "rel": "bar",
      "rev": "foo",
      "type": "thing.bar",
      "uri": "/bar/456",
      "href": "http://localhost/api/bar/456"
    }
  ],
  "_bar": [
    {
      "self": {
        "type": "thing.bar",
        "uri": "/bar/456",
        "href": "http://localhost/api/bar/456"
      },
      "links": [
        {
          ..other link..
        },
        {
          ..other link..
        }
      ]
    }
  ]
}

আকর্ষণীয়, আমি ইতিমধ্যে ইউআরআইয়ের সাথে সংযুক্ত সংযোগগুলি অপসারণের জন্য হাইপারমিডিয়া লিঙ্ক / নিয়ন্ত্রণগুলি ব্যবহার করছি, তবে আমি "ড্রিল ডাউন" ধারণাটি নিয়ে ভাবিনি যা খুব আশাব্যঞ্জক বলে মনে হয়। কোনও JSON উপস্থাপনা কেমন দেখতে পেল? এই মুহুর্তে, আমার সংস্থানগুলির প্রতিটি JSON উপস্থাপনায় একটি linksঅ্যারে রয়েছে , প্রতিটি এন্ট্রি একটি relএবং একটি uriক্ষেত্রের সাথে একটি লিঙ্ক অবজেক্ট (আপনার এক্সএমএল উদাহরণের মতো)। আমি কি প্রতিটি লিঙ্ক অবজেক্টে (যেমন data) তৃতীয় ক্ষেত্র যুক্ত করব ? কোন মান আছে?
ceran

ড্রিল ডাউন আসলে একটি বিশ্রাম বৈশিষ্ট্য নয়, তাই কোনও মান নেই (কমপক্ষে যা আমি জানি।
কিওয়ারকি

কিছু প্রস্তাবিত মান রয়েছে, যেমন stateless.co/hal_specifications.html যা আমি আমাদের অ্যাপ্লিকেশনগুলিতে ব্যবহার করছি। এটি আপনার উদাহরণের খুব কাছাকাছি।
পিট কির্খাম

4

সব প্রশ্নের 95% চান Fooসেইসাথে Bar, তারপর কেবল তা ফেরত ভিতরে এর Fooঅবজেক্ট যখন আপনি একটি অনুরোধ Foo। কেবল কোনও সম্পত্তি যুক্ত করুন bar(বা সম্পর্কের জন্য কোনও অন্য শব্দ), এবং এটিকে রাখুনBar সেখানে বস্তুটি রাখুন। যদি সম্পর্কের অস্তিত্ব না থাকে তবে নাল ব্যবহার করুন।

আমি মনে করি আপনি এটিকে ওভারথিং করছেন :)


আমার এই সংখ্যাটি (95%) নিয়ে আসা উচিত ছিল না, এটি ভুল ছিল, দুঃখিত। আমি যা বলতে চাইছিলাম তা হ'ল অনুরোধের একটি বড় অংশ একই সাথে উভয় সংস্থানগুলিতে আগ্রহী। তবে এখনও প্রাসঙ্গিক সংখ্যক অনুরোধ রয়েছে যা কেবলমাত্র আগ্রহী Fooএবং যেহেতু প্রতিটি Barস্মৃতিতে যথেষ্ট বিশাল (প্রায় 3x-4x আকারের Foo) Barতাই কোনও ক্লায়েন্ট স্পষ্টভাবে অনুরোধ না করলে আমি কোনও ফিরিয়ে দিতে চাই না।
ceran

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