উত্তরাধিকার সহ একটি RESTful এপিআই কীভাবে মডেল করবেন?


88

আমার একটি অবজেক্ট হাইয়ারার্কি রয়েছে যাতে আমার একটি RESTful API এর মাধ্যমে প্রকাশ করতে হবে এবং আমি নিশ্চিত না যে আমার ইউআরএলগুলি কীভাবে কাঠামোগত করা উচিত এবং সেগুলি কী ফিরিয়ে আনবে। আমি কোনও সেরা অনুশীলন খুঁজে পাইনি।

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

আমার প্রথম ধারণাটি এই জাতীয় কিছু করা ছিল:

GET /animals        # get all animals
POST /animals       # create a dog or cat
GET /animals/123    # get animal 123

জিনিসটি হ'ল / প্রাণী সংগ্রহগুলি এখন "বেমানান", কারণ এটি ফিরে আসতে পারে এবং ঠিক একই কাঠামোগুলি (কুকুর এবং বিড়াল) না থাকা জিনিসগুলি নিতে পারে। পৃথক বৈশিষ্ট্যযুক্ত কোনও সংগ্রহ ফেরত দেওয়া অবজেক্টগুলি রাখা কি "RESTful" হিসাবে বিবেচিত হয়?

আর একটি সমাধান হ'ল এইভাবে প্রতিটি কংক্রিটের জন্য একটি ইউআরএল তৈরি করা:

GET /dogs       # get all dogs
POST /dogs      # create a dog
GET /dogs/123   # get dog 123

GET /cats       # get all cats
POST /cats      # create a cat
GET /cats/123   # get cat 123

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

আরেকটি পরামর্শ ছিল এটি যুক্ত করে দ্বিতীয় সমাধানটি বাড়ানো:

GET /animals    # get common attributes of all animals

এই ক্ষেত্রে, ফিরে আসা প্রাণীগুলিতে কুকুর-নির্দিষ্ট এবং বিড়াল-নির্দিষ্ট বৈশিষ্ট্যগুলি বাদ দিয়ে কেবলমাত্র সমস্ত প্রাণীর মধ্যে সাধারণ বৈশিষ্ট্য থাকবে। এটি সমস্ত প্রাণীকে পুনরুদ্ধার করতে অনুমতি দেয়, যদিও খুব কম বিশদ সহ। প্রতিটি প্রত্যাবর্তিত অবজেক্টে বিশদ, কংক্রিট সংস্করণের লিঙ্ক থাকতে পারে।

কোন মন্তব্য বা পরামর্শ?

উত্তর:


41

আমি সুপারিশ করেছিলাম:

  • সংস্থান প্রতি এক ইউআরআই ব্যবহার করা
  • কেবলমাত্র বৈশিষ্ট্য স্তরে প্রাণীর মধ্যে পার্থক্য করা

একই সংস্থানটিতে একাধিক ইউআরআই সেটআপ করা কখনই ভাল ধারণা নয় কারণ এটি বিভ্রান্তি এবং অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া সৃষ্টি করতে পারে। এটি দেওয়া, আপনার একক ইউআরআই একটি জেনেরিক স্কিমের উপর ভিত্তি করে হওয়া উচিত /animals

"বেস" স্তরে কুকুর এবং বিড়ালদের পুরো সংগ্রহ নিয়ে কাজ করার পরবর্তী চ্যালেঞ্জটি ইতিমধ্যে /animalsইউআরআই পদ্ধতির কারণে সমাধান করা হয়েছে ।

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

GET /animals( Accept : application/vnd.vet-services.animals+json)

{
   "animals":[
      {
         "link":"/animals/3424",
         "type":"dog",
         "name":"Rex"
      },
      {
         "link":"/animals/7829",
         "type":"cat",
         "name":"Mittens"
      }
   ]
}
  • GET /animals - সমস্ত কুকুর এবং বিড়াল পায়, রেক্স এবং মিটেন উভয়ই ফিরিয়ে আনবে
  • GET /animals?type=dog - সমস্ত কুকুর পায়, কেবল রেক্সকে ফিরিয়ে দেবে
  • GET /animals?type=cat - সমস্ত বিড়াল পায়, কেবল মিটেনস

তারপরে প্রাণী তৈরি বা সংশোধন করার সময়, কলকারীকে জড়িত প্রাণীর ধরণ নির্দিষ্ট করতে বাধ্য করা হবে:

আমি আজ খুশি: application/vnd.vet-services.animal+json

{
   "type":"dog",
   "name":"Fido"
}

উপরের পেডলোডটি একটি অনুরোধ POSTবা PUTঅনুরোধের মাধ্যমে পাঠানো যেতে পারে ।

উপরোক্ত স্কিমটি আপনাকে আরইএসটি এর মাধ্যমে ওও উত্তরাধিকার হিসাবে মৌলিক অনুরূপ বৈশিষ্ট্যগুলি সরবরাহ করে এবং বড় ধরনের শল্যচিকিৎসা ছাড়াই বা আপনার ইউআরআই স্কিমে কোনও পরিবর্তন ছাড়াই আরও বিশেষত্ব (অর্থাত্ আরও প্রাণীর প্রকার) যুক্ত করার ক্ষমতা সহ।


এটি একটি REST এপিআই এর মাধ্যমে "ingালাই" এর সাথে খুব মিল। এটি একটি সি ++ সাবক্লাসের মেমরি লেআউটে সমস্যাগুলি / সমাধানগুলি মনে করিয়ে দেয়। উদাহরণস্বরূপ, কোথায় এবং কীভাবে উভয় একই সাথে মেমরিতে একক ঠিকানা সহ একটি বেস এবং সাবক্লাস উপস্থাপন করবে।
ট্র্যাকার্ডেন

10
আমি পরামর্শ দিচ্ছি: GET /animals - gets all dogs and cats GET /animals/dogs - gets all dogs GET /animals/cats - gets all cats
28:58

4
জিইটি অনুরোধের প্যারামিটার হিসাবে পছন্দসই ধরণটি নির্দিষ্ট করার পাশাপাশি: মনে হয় আপনি এটি অর্জনের জন্য গ্রহণযোগ্য প্রকারটিও ব্যবহার করতে পারেন। তা হ'ল: GET /animals গ্রহণ করুনapplication/vnd.vet-services.animal.dog+json
ব্রায়ানটি।

22
বিড়াল এবং কুকুরের প্রত্যেকের স্বতন্ত্র বৈশিষ্ট্য থাকলে কী হবে? আপনি কীভাবে POSTএটিকে পরিচালনা করবেন, কারণ বেশিরভাগ ফ্রেমওয়ার্কগুলি জানেন না যে কীভাবে এটি কোনও মডেল হিসাবে সঠিকভাবে ডিসরিয়ালাইজ করা যায় কারণ জসন ভাল টাইপিংয়ের তথ্য রাখে না। আপনি কিভাবে পোস্ট কেস পরিচালনা করবেন [{"type":"dog","name":"Fido","playsFetch":true},{"type":"cat","name":"Sparkles","likesToPurr":"sometimes"}?
এলবি 2

4
কুকুর এবং বিড়ালদের (সংখ্যাগরিষ্ঠ) আলাদা আলাদা সম্পত্তি থাকলে কী হবে? যেমন # 1 এসএমএসের জন্য একটি যোগাযোগ পোস্ট করা (টু মাস্ক) বনাম একটি ইমেল (ইমেল ঠিকানা, সিসি, বিসিসি, থেকে, isHtml), বা উদাহরণস্বরূপ # 2 ক্রেডিটকার্ডের জন্য একটি অর্থায়ন উত্স পোস্ট করা (মুখোশযুক্ত প্যান, নামঅনকার্ড, মেয়াদোত্তীকরণ) বনাম vs একটি ব্যাংক হিসাব (বিএসবি, অ্যাকাউন্ট নাম্বার) ... আপনি কি এখনও একটি একক এপিআই রিসোর্স ব্যবহার করবেন? এটি SOLID নীতিগুলি থেকে একক দায়বদ্ধতা লঙ্ঘন করেছে বলে মনে হচ্ছে, তবে এটি যদি এপিআই ডিজাইনের ক্ষেত্রে প্রযোজ্য কিনা তা নিশ্চিত নয় ...
রায়ান.বার্টস্

5

এই প্রশ্নের উত্তর ওপেনপিআইয়ের সর্বশেষ সংস্করণে সাম্প্রতিক বর্ধনের সাহায্যে আরও ভালভাবে দেওয়া যেতে পারে।

ওও, অল অফ, যেকোন অফ হিসাবে কীওয়ার্ড ব্যবহার করে স্কিমাগুলি একত্রিত করা সম্ভব হয়েছে এবং জেএসওএন স্কিমা ভি ১.০ থেকে কোনও বার্তা পে-লোড যাচাই করা হয়েছে।

https://spacetelescope.github.io/unders বোঝ- জসন-schema/references/combining.html

যাইহোক, OpenAPI (সাবেক Swagger থেকে) এ, স্কীমগুলি রচনা কীওয়ার্ড লিখে উন্নত করা হয়েছে discriminator (2.0 + +) এবং oneOf (v3.0 + +) সত্যিই সমর্থন পলিমরফিজম করতে।

https://github.com/OAI/OpenAPI-Specifications/blob/master/versions/3.0.0.md#schemaComposition

আপনার উত্তরাধিকারটি ওয়ানওএফ (উপপ্রকারগুলির মধ্যে একটি বেছে নেওয়ার জন্য) এবং অলওফ (টাইপ এবং এর একটির উপকারের সাথে একত্রিত করার জন্য) সমন্বয় করে মডেল করা যেতে পারে। নীচে পোষ্ট পদ্ধতির জন্য একটি নমুনা সংজ্ঞা দেওয়া আছে।

paths:
  /animals:
    post:
      requestBody:
      content:
        application/json:
          schema:
            oneOf:
              - $ref: '#/components/schemas/Dog'
              - $ref: '#/components/schemas/Cat'
              - $ref: '#/components/schemas/Fish'
            discriminator:
              propertyName: animal_type
     responses:
       '201':
         description: Created

components:
  schemas:
    Animal:
      type: object
      required:
        - animal_type
        - name
      properties:
        animal_type:
          type: string
        name:
          type: string
      discriminator:
        property_name: animal_type
    Dog:
      allOf:
        - $ref: "#/components/schemas/Animal"
        - type: object
          properties:
            playsFetch:
              type: string
    Cat:
      allOf:
        - $ref: "#/components/schemas/Animal"
        - type: object
          properties:
            likesToPurr:
              type: string
    Fish:
      allOf:
        - $ref: "#/components/schemas/Animal"
        - type: object
          properties:
            water-type:
              type: string

4
এটি সত্য যে ওএএস এটির অনুমতি দেয়। তবে সোয়াগার ইউআই ( লিঙ্ক ) এ প্রদর্শিত বৈশিষ্ট্যটির জন্য কোনও সমর্থন নেই এবং আমি মনে করি যদি আপনি কারও কাছে এটি না দেখাতে পারেন তবে কোনও বৈশিষ্ট্য সীমিতভাবে ব্যবহারযোগ্য।
এমফ্ট

4
@ এমফ্ট, সত্য নয় এই উত্তরটি লেখার ক্ষেত্রে, সোয়াগার ইউআই ইতিমধ্যে এটি সমর্থন করে।
আন্দ্রেজ ক্যানিকোভস

ধন্যবাদ, এটি দুর্দান্ত কাজ করে! এটি বর্তমানে সত্য বলে মনে হচ্ছে যে সোয়াগার ইউআই যদিও এটি পুরোপুরি প্রদর্শন করে না। মডেলগুলি নীচের অংশে স্কিমাস বিভাগে প্রদর্শিত হবে এবং ওয়ান অফারটি উল্লেখ করে যে কোনও প্রতিক্রিয়া বিভাগটি আংশিকভাবে ইউআইতে প্রদর্শিত হবে (শুধুমাত্র স্কিমা, কোনও উদাহরণ নেই), তবে আপনি অনুরোধ ইনপুটটির জন্য কোনও উদাহরণ পাবেন না। এর জন্য গিথুব ইস্যুটি 3 বছর ধরে উন্মুক্ত রয়েছে তাই সম্ভবত এভাবেই থাকার সম্ভাবনা রয়েছে: github.com/swagger-api/swagger-ui/issues/3803
Jethro

4

আমি / কুকুর এবং মাছ উভয় এবং অন্য কি উভয় একটি তালিকা ফিরে প্রাণী যেতে হবে:

<animals>
  <animal type="dog">
    <name>Fido</name>
    <fur-color>White</fur-color>
  </animal>
  <animal type="fish">
    <name>Wanda</name>
    <water-type>Salt</water-type>
  </animal>
</animals>

অনুরূপ JSON উদাহরণ কার্যকর করা সহজ হওয়া উচিত।

ক্লায়েন্টরা সর্বদা সেখানে থাকা "নাম" উপাদানটির উপর নির্ভর করতে পারে (একটি সাধারণ বৈশিষ্ট্য)। তবে "প্রকার" বৈশিষ্ট্যের উপর নির্ভর করে প্রাণী উপস্থাপনের অংশ হিসাবে অন্যান্য উপাদান থাকবে be

এ জাতীয় তালিকা ফেরত দেওয়ার মতো অন্তঃসত্ত্বাভাবে বিশ্রাম বা অস্থির কিছু নেই - আরআরইএসটি উপাত্ত উপস্থাপনের জন্য কোনও নির্দিষ্ট বিন্যাস লিখে দেয় না pres কেবলমাত্র এটিই বলেছে যে ডেটাটির অবশ্যই কিছু উপস্থাপনা থাকতে হবে এবং সেই প্রতিনিধিত্বের জন্য ফর্ম্যাটটি মিডিয়া টাইপ (যা HTTP তে বিষয়বস্তু-টাইপ শিরোনাম) দ্বারা সনাক্ত করা যায়।

আপনার ব্যবহারের ক্ষেত্রে চিন্তা করুন - আপনার কি মিশ্র প্রাণীর একটি তালিকা প্রদর্শন করা দরকার? ঠিক আছে, তারপরে মিশ্র প্রাণীর ডেটার একটি তালিকা ফেরত দিন। আপনার কি কেবল কুকুরের তালিকা দরকার? ঠিক আছে, এই ধরনের একটি তালিকা তৈরি করুন।

আপনি / প্রাণীরা করেন কিনা? টাইপ = কুকুর বা / কুকুরগুলি আরএসটি-র সাথে সম্পর্কিত যা কোনও ইউআরএল ফর্ম্যাট নির্ধারণ করে না - এটি আরএসটি-র আওতার বাইরে বাস্তবায়নের বিশদ হিসাবে ছেড়ে যায়। REST কেবলমাত্র সূত্রগুলিতে শনাক্তকারীদের সনাক্তকারী থাকতে হবে - কোন ফর্ম্যাটটি মনে করবেন না।

একটি RESTful API এর কাছাকাছি যেতে আপনার কিছু হাইপার মিডিয়া যুক্ত করতে হবে। উদাহরণস্বরূপ পশুর বিবরণে রেফারেন্স যুক্ত করে:

<animals>
  <animal type="dog" href="https://stackoverflow.com/animals/123">
    <name>Fido</name>
    <fur-color>White</fur-color>
  </animal>
  <animal type="fish" href="https://stackoverflow.com/animals/321">
    <name>Wanda</name>
    <water-type>Salt</water-type>
  </animal>
</animals>

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


1

তবে এখন কুকুর এবং বিড়ালের মধ্যে সম্পর্ক নষ্ট হয়ে গেছে।

প্রকৃতপক্ষে, তবে মনে রাখবেন যে ইউআরআই কখনও কখনও বস্তুর মধ্যে সম্পর্ককে প্রতিফলিত করে না।


1

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি একটি বিশিষ্ট উত্তরাধিকারের মডেলিংয়ের বিষয়ে আরও তদন্ত করতে আগ্রহী

আমি সবসময় বলতে পারি যে কুকুরটি একটি প্রাণী এবং মুরগীও, তবে মুরগি ডিম তৈরি করে এবং কুকুরটি স্তন্যপায়ী প্রাণী থাকে, তাই এটি পারে না। একটি এপিআই পছন্দ

GET প্রাণী /: অ্যানিমাল আইডি / ডিম

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

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

জিইটি / পশু /

এখানে ত্রুটিটি হ'ল যে, কেউ মুরগি সংগ্রহের উদাহরণের জন্য একটি কুকুর আইডি পাস করতে পারে তবে কুকুরটি মুরগি নয়, তাই কারণটির বার্তাটি যদি 404 বা 400 হয় তবে এটি ভুল হবে না

আমি কি ভূল?


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

0

হ্যাঁ, আপনি ভুল বলেছেন। এছাড়াও ওপেনপিআইআই স্পেস অনুসরণ করে উদাহরণস্বরূপ সম্পর্কগুলি মডেল করা যেতে পারে যেমন এই পলিমারফিক পদ্ধতিতে।

Chicken:
  type: object
  discriminator:
    propertyName: typeInformation
  allOf:
    - $ref:'#components/schemas/Chicken'
    - type: object
      properties:
        eggs:
          type: array
          items:
            $ref:'#/components/schemas/Egg'
          name:
            type: string

...


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