নেস্টেড আরইএসটি ইউআরএল এবং প্যারেন্ট আইডি, এটি আরও ভাল ডিজাইন?


20

ঠিক আছে, আমাদের দুটি সংস্থান আছে: Albumএবং Song। এখানে এপিআই:

GET,POST /albums
GET,POST /albums/:albumId
GET,POST /albums/:albumId/songs
GET,POST /albums/:albumId/songs/:songId

আমরা জানি যে আমরা কিছু গানকে ঘৃণা করি, এটি বলা হয় Susy, উদাহরণস্বরূপ। আমাদের কোথায় searchপদক্ষেপ নেওয়া উচিত ?

আরেকটি প্রশ্ন. ঠিক আছে, এখন এটি আরও বাস্তব। আমরা অ্যালবাম 1 খুলি এবং সমস্ত গান লোড করি। আমরা জেএস অবজেক্ট তৈরি করি, প্রত্যেকের গানের ডেটা থাকে এবং এর মতো কয়েকটি পদ্ধতি রয়েছে: remove, update

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

সুতরাং, আমি কয়েকটি সমাধান দেখতে পাচ্ছি, তবে আমি সত্যই নিশ্চিত নই।

  1. প্যারেন্ট আইডি alচ্ছিক করুন - গেট-প্যারামিটার হিসাবে। এই পদ্ধতিটি আমি বর্তমানে ব্যবহার করি তবে আমার মনে হয় এটি কুশ্রী।

    List,Create /songs?album=albumId
    Update,Delete /songs/:songId
    Get /songs/?name=susy # also, solution for first question
    
  2. হাইব্রীড। OPTIONSমেটা ডেটা পেতে কোয়েরি সম্পাদনের জন্য আমাদের অ্যালবাম আইডি দরকার হওয়ায় এটি এখন সহজ ।

    List,Create /album/:albumId/songs
    Update,Delete /songs/:songId
    POST /songs/search # also, solution for first question
    
  3. প্রতিটি রিসোর্স উদাহরণ সহ পুরো url ফিরিয়ে দিন। এপিআই একই, তবে আমরা এর মতো গান পাব:

    id: 5
    name: 'Elegy'
    url: /albums/2/songs/5
    

    আমি শুনেছি এই পদ্ধতির নামটি হেটোয়াস।

  4. তাই ... প্যারেন্ট আইডি সরবরাহ করতে

    id: 5
    name: 'Elegy'
    albumId: 2
    

কোনটা ভাল? নাকি আমি বোবা? কিছু পরামর্শ ছুড়ে দিন, বলছি!

উত্তর:


31

আমাদের কোথায় অনুসন্ধানের কাজ করা উচিত?

ইন GET /search/:text। এটি ম্যাচগুলিতে একটি JSON অ্যারে ফিরিয়ে আনবে, প্রতিটি মিল এটির অন্তর্গত অ্যালবাম সহ। এটি উপলব্ধি করে, কারণ ক্লায়েন্ট নিজেই ট্র্যাকটিতে আগ্রহী না হতে পারে তবে পুরো অ্যালবামটি (কল্পনা করুন যে আপনি এমন একটি গান অনুসন্ধান করছেন যা আপনার বিশ্বাস, আপনি যে নামটি মনে রেখেছিলেন সেই একই অ্যালবামে ছিল)।

প্রত্যেকের সাথে প্যারেন্টস আইডিকে ফিরিয়ে দেওয়া ভাল হবে না। আমি কি ভূল?

পৃথক ট্র্যাকগুলিতে অ্যালবাম থাকতে পারে। এটি নিশ্চিত করবে যে আপনি যদি অ্যালবামের মাধ্যমে বা অনুসন্ধানের মাধ্যমে ট্র্যাক পেতে পারেন তবে ট্র্যাকের উপস্থাপনাটি অভিন্ন কিনা (এখানে কোনও অ্যালবাম নেই)।

কোনটা ভাল?

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

নাকি আমি বোবা?

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

সমস্যাযুক্ত হতে পারে এমন একটি দিক হ'ল আপনি কীভাবে তথ্য অভ্যন্তরীণভাবে সংগঠিত করেন, অর্থাৎ শ্রেণিবিন্যাসের ব্যবহার। আপনার মন্তব্য থেকে, আপনি ভাবছেন যে এর প্রতিক্রিয়া কী হওয়া উচিত GET /artist/1/album/10/song/3/comment/23, যা একটি খুব বৃক্ষমুখী দৃষ্টিভঙ্গি দেখায়। পরে সিস্টেমটি প্রসারিত করার সময় এটি কয়েকটি সমস্যার কারণ হতে পারে। এই ক্ষেত্রে:

  • একটি গানের অ্যালবাম না থাকলে কী হবে?
  • যদি কোনও অ্যালবামের বেশ কয়েকটি শিল্পী থাকে তবে কী হবে?
  • আপনি যদি এমন কোনও বৈশিষ্ট্য যুক্ত করতে চান যা অ্যালবাম মন্তব্য করা সম্ভব করে?
  • সেখানে যদি মন্তব্য করার মতামত থাকা উচিত?
  • প্রভৃতি

এটি মূলত আমার ব্লগটিতে ব্যাখ্যা করা সমস্যা : গাছের উপস্থাপনের অনেক ক্ষেত্রে কার্যকরভাবে ব্যবহার করার জন্য অনেকগুলি সীমাবদ্ধতা রয়েছে।

শ্রেণিবিন্যাসকে ধ্বংস করলে কী হবে? দেখা যাক.

  1. GET /albums/:albumIdঅ্যালবাম সম্পর্কে মেটা তথ্য (যেমন এটি প্রকাশিত হওয়ার বছর বা অ্যালবামের কভার দেখাচ্ছে জেপিইগির ইউআরআই) এবং ট্র্যাকের একটি অ্যারের সমন্বিত একটি জেএসওন ফেরত দেয়। উদাহরণ স্বরূপ:

    GET /albums/151
    {
        "id": 151,
        "gid": "dbd3cec7-b927-423f-894b-742c4c7b54ce",
        "name": "Yellow Submarine",
        "year": 1969,
        "genre": "Psychedelic rock",
        "artists": ["John Lennon", "Paul McCartney", ...],
        "tracks": [
            {
                "id": 90224,
                "title": "Yellow Submarine",
                "length": "2:40"
            },
            {
                "id": 83192,
                "title": "Only a Northern Song",
                "length": "3:24"
            }
            ...
        ]
    }

    আমি কেন প্রতিটি ট্র্যাকের দৈর্ঘ্য অন্তর্ভুক্ত করব? কারণ আমি কল্পনা করি যে কোনও অ্যালবাম দেখানো ক্লায়েন্ট শিরোনাম অনুসারে ট্র্যাকগুলি তালিকাভুক্ত করতে আগ্রহী হতে পারে তবে প্রতিটি ট্র্যাকের দৈর্ঘ্যও দেখায় — বেশিরভাগ ক্লায়েন্টই করেন। অন্যদিকে, আমি প্রতিটি ট্র্যাকের জন্য সুরকার (গুলি) বা শিল্পী (গুলি) নাও দেখাই, কারণ আমি সিদ্ধান্ত নিয়েছি যে এই তথ্যটি এই স্তরের প্রয়োজনীয় নয়। স্পষ্টতই, আপনার পছন্দগুলি আলাদা হতে পারে।

  2. GET /tracks/:trackIdনির্দিষ্ট ট্র্যাকের তথ্য ফেরত দেয়। যেহেতু আর কোনও শ্রেণিবদ্ধতা নেই, তাই আপনাকে অ্যালবাম বা শিল্পী অনুমান করার দরকার নেই: কেবলমাত্র আপনাকে যা জানতে হবে তা হ'ল ট্র্যাকটির সনাক্তকারী।

    নাও হতে পারে? যদি আপনি নাম দিয়ে এটি নির্দিষ্ট করতে পারেন GET /tracks/:trackName?

    GET /tracks/Only%20a%20Northern%20Song
    {
        "id": 83192,
        "gid": "8d9c4311-9d7b-40a4-8aeb-4fe96247fe2b",
        "title": "Only a Northern Song",
        "writers": ["George Harrison"],
        "artists": ["John Lennon", "Paul McCartney", "Ringo Starr"],
        "length": "3:24",
        "record-date": 1967,
        "albums": [151, 164],
        "soundtrack": {
            "uri": "http://audio.example.com/tracks/static/83192.mp3",
            "alias": "Beatles - Only a Northern Song.mp3",
            "length-bytes": 3524667,
            "allow-streaming": true,
            "allow-download": false
        }
    }

    এখন কাছাকাছি তাকান albums; তুমি কি দেখতে পাও? ডান, এক নয়, দুটি অ্যালবাম। আপনার যদি শ্রেণিবদ্ধতা থাকে তবে আপনি এটি করতে পারবেন না (যদি আপনি রেকর্ডটি নকল না করেন)।

  3. GET /comments/:objectGid। আপনি প্রতিক্রিয়াগুলিতে কুরুচিপূর্ণ জিইউডিগুলিকে স্পট করেছেন। অ্যালবাম, বা শিল্পী বা ট্র্যাকগুলিতে প্রয়োগ করা যেতে পারে এমন কার্য সম্পাদন করার জন্য এই জিইউইডিগুলি ডাটাবেস জুড়ে সত্তাকে সনাক্ত করা সম্ভব করে। যেমন মন্তব্য।

    GET /comments/8d9c4311-9d7b-40a4-8aeb-4fe96247fe2b
    [
        {
            "author": {
                "id": 509931,
                "display-name": "Arseni Mourzenko"
            },
            "text": "What a great song! (And I'm proud of the usefulness of my comment)",
            "concerned-object": "/tracks/83192"
        }
    ]

    মন্তব্যটি সংশ্লিষ্ট অবজেক্টের উল্লেখ করে, এর প্রসঙ্গে বাইরের মন্তব্য অ্যাক্সেস করার সময় এটিতে যাওয়া সম্ভব করে তোলে (উদাহরণস্বরূপ সর্বশেষ মন্তব্যের মধ্য দিয়ে যাওয়ার সময় GET /comments/latest)।

মনে রাখবেন যে এর অর্থ এই নয় যে আপনার এপিআইতে কোনও রূপের স্তরক্রম এড়ানো উচিত। এমন কিছু ঘটনা রয়েছে যেখানে এটি অর্থবোধ করে। একটি চলতি নিয়ম হিসাবে:

  • যদি উত্সটি তার পিতামাতার উত্সের প্রেক্ষাপটের বাইরে কোনও ধারণা দেয় না, তবে স্তরক্রমটি ব্যবহার করুন।

  • যদি উত্স একা (1) বা (2) বিভিন্ন ধরণের পিতামাতার সংস্থার প্রসঙ্গে বা (3) একাধিক পিতা-মাতার থাকতে পারে তবে স্তরক্রমটি ব্যবহার করা উচিত নয়।

উদাহরণস্বরূপ, কোনও ফাইলের রেখাগুলি কোনও ফাইলের প্রসঙ্গে বাইরে বোঝায় না, তাই:

GET /file/:fileId

এবং:

GET /file/:fileId/line/:lineIndex

ঠিক আছে।


হ্যাঁ, অনুসন্ধান থেকে, আমিও পুরো অ্যালবামের তথ্য ফিরে আসতে পারি, এটি অন্য একটি উত্স তৈরি করবে - SongSearchResult, এটি ঠিক আছে, আমি ধরে নিই। তবে ইউআরএল সম্পর্কে কী? আমি কি parentIDপ্রতিটি বস্তু সরবরাহ করতে এবং এটি জিইটি-প্যারামিটার বা ইউআরএলের স্বাভাবিক অংশ হিসাবে ব্যবহার করব? আমার গভীরতা> 2 থাকলে কী হবে? /artist/1/album/10/song/3/comment/23- শিল্পী, অ্যালবাম এবং গানের প্রতিটি আইডি commentঅবজেক্টে সরবরাহ করা পাগল , তবে আমি শুনেছি এটি যাওয়ার উপায়, তবে তা কী অবজ্ঞাপূর্ণ নয় ?!
dt0xff

@ dt0xff: আমি আমার উত্তর সম্পাদনা করেছি। আমি মনে করি এটি এখন গভীরতা কীভাবে এড়ানো যায় তার একটি পরিষ্কার চিত্র দেওয়া উচিত।
আর্সেনী মোরজেনকো

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

দুর্দান্ত উত্তর। যদিও আমার কয়েকটি আপত্তি আছে। "যদি কোনও অ্যালবামের বেশ কয়েকটি শিল্পী থাকে তবে কী হবে?" বাইনারি সম্পর্ক ইউআরআই -> রিসোর্সটি ডান-ইউনিক (একাধিক থেকে এক) হিসাবে বিভিন্ন ইউআরআই একই সংস্থানটি সনাক্ত করতে পারে । সুতরাং ইউআরআই /artists/foo/albums/quxএবং /artists/bar/albums/quxএকই অ্যালবামের উত্সকে পুরোপুরি সনাক্ত করতে পারে। অন্য কথায়, কোনও ইউআরআই-তে পথের উপাদানটি একটি গ্রাফ শ্রেণিবিন্যাসের প্রতিনিধিত্ব করে , অগত্যা গাছের শ্রেণিবিন্যাস নয়, যা এটি কেবল বিভাগগুলি নয় তবে ট্যাগগুলিকে উপস্থাপনের জন্য উপযুক্ত করে তোলে।
ম্যাগগিরো

1
… "এটি মূলত আমার ব্লগে ব্যাখ্যা করা সমস্যা : গাছের উপস্থাপনের অনেক ক্ষেত্রে কার্যকরভাবে ব্যবহার করার জন্য অনেকগুলি সীমাবদ্ধতা রয়েছে" " সুতরাং না, এটি কোনও সমস্যা নয়। "আপনি যদি এমন কোনও বৈশিষ্ট্য যুক্ত করতে চান যা অ্যালবাম মন্তব্য করা সম্ভব করে?" এটা একটা সমস্যা হয় না আছে: /artists/foo/albums/qux/comments/7। "যদি মন্তব্য করার মত মন্তব্য থাকতে হবে?" অনুরূপভাবে: /artists/foo/albums/qux/song/5/comments/2/comments/8
ম্যাগগিরো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.