REST এপিআই - নীচের জেএসওন বিষয়গুলি এপিআইকে ফেরা উচিত?


38

যখন এটি JSON এপিআইতে আসে তখন প্রতিক্রিয়াগুলি স্থির করে নেস্টেড জেএসওএন বিষয়গুলি এড়ানো ভাল অভ্যাস?

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

বলুন আপনি অনুরোধ / গেম / 1 যা আইডি 1 এর সাথে গেমটি আনে এবং এটি প্ল্যাটফর্মগুলি এবং এসেরব্র্যাটিং নেস্টযুক্ত গেমের অবজেক্টটি ফিরিয়ে দেয়।

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"id":1,"name":"Xbox"},
    {"id":2,"name":"Playstation"}
  ],
  "esrbRating": {
    "id": 1,
    "code": "E",
    "name": "Everyone"
  }
}

আপনি যদি জেপিএ / হাইবারনেটের মতো কিছু ব্যবহার করে থাকেন তবে এটি FETCH.EAGER এ সেট করা থাকলে স্বয়ংক্রিয়ভাবে এটি আপনার জন্য এটি করতে পারে।

অন্য বিকল্পটি হ'ল এপিআই এবং আরও শেষ পয়েন্ট যুক্ত করা।

সেক্ষেত্রে যখন / গেম / ১-কে অনুরোধ করা হয় কেবল গেমের অবজেক্ট ফিরিয়ে দেওয়া হয়।

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
}

আপনি যদি প্ল্যাটফর্মগুলি এবং / অথবা ইএসআরব্রিটিং চান তবে আপনাকে নিম্নলিখিতগুলিতে কল করতে হবে:

/ গেম / 1 / প্ল্যাটফর্ম / গেম / 1 / এসএসবি

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

আমি সর্বশেষে একবারে ভাবছিলাম যেখানে আপনার এইরকম কিছু ফিরে আসবে।

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": ["Xbox","Playstation"]
}

তবে এটি ধরে নেয় যে তাদের আইডি বা অন্য যে কোনও তথ্য এই প্ল্যাটফর্মের সাথে সম্পর্কিত হতে পারে না।

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

আমি দৃ Spring়তার জন্য জেপিএ / হাইবারনেট বা মাইবাতিস উভয়ের সাথেই এপিআইয়ের ব্যাকএন্ড প্রযুক্তি হিসাবে স্প্রিং এমভিসি ব্যবহারের সাথে সম্পর্কিত একটি উত্তর শুনতে চাই।


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

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

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

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

1
সার্ভারে কল ব্যয়বহুল। একাধিক কল ব্যবহার করে আপনাকে ডেটা প্রেরণের প্রয়োজন এমন একটি এপিআই এমন একটি এপিআইর তুলনায় ধীর গতির হতে পারে যা প্রায়শই এমনকি পরেও অনিবদ্ধ তথ্য ফিরে আসে।
রোবট

উত্তর:


11

অন্য বিকল্প (HATEOAS ব্যবহার করে)। এটি সহজ, বেশিরভাগ অনুশীলনে আপনি হেটোয়াসের ব্যবহারের উপর নির্ভর করে আপনি জসনে একটি লিঙ্ক ট্যাগ যুক্ত করেন।

http://api.example.com/games/1:

{
  "id": 1,
  "title": "Game A",
  "publisher": "Publisher ABC",
  "developer": "Developer DEF",
  "releaseDate": "2015-01-01",
  "platforms": [
    {"_self": "http://api.example.com/games/1/platforms/53", "name": "Playstation"},
    {"_self": "http://api.example.com/games/1/platforms/34", "name": "Xbox"},
  ]
}

http://api.example.com/games/1/platforms/34:

{
  "id": 34,
  "title": "Xbox",
  "publisher": "Microsoft",
  "releaseDate": "2015-01-01",
  "testReport": "http://api.example.com/games/1/platforms/34/reports/84848.pdf",
  "forms": [
    {"type": "edit", "fields: [] },
  ]
}

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

প্রযুক্তিগত বাস্তবায়নে ক্যাচিং থাকতে পারে। আপনি গেম অবজেক্টে প্ল্যাটফর্মের লিঙ্ক এবং নামগুলি ক্যাশে করতে পারবেন এবং প্ল্যাটফর্ম এপিআই মোটেও লোড না করে তাৎক্ষণিকভাবে প্রেরণ করতে পারবেন। তারপরে যখন প্রয়োজন হয় আপনি এটি লোড করতে পারেন।

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


আমি মনে করি না যে এটি কোনও প্রযুক্তি নেই বলে কোনও রাষ্ট্র নেই techn
রিবল্ড এডি

হ্যাঁ, এই প্রক্রিয়াটির সঠিক শব্দটি নিশ্চিত নন। হ্যাটোস সাধারণভাবে এপিআই-র লিঙ্কের জন্য ব্যবহৃত হচ্ছে তবে আমি সম্মত হই যে এটি রাষ্ট্রের সাথেও করতে হবে। যদিও বাস্তবায়নের ধারণাটি একই হবে। উদাহরণস্বরূপ এটি কীভাবে ব্যবহার করা যেতে পারে সে সম্পর্কে আপনি এখানে আরও কিছু দেখুন: stormpath.com/blog/linking-and-resource-expansion-rest-api-tips
লূক ফ্রাঙ্কেন

যদিও এটি একটি ভাল ধারণা!
রিবল্ড এডি

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

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

16

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


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

5

আমি দ্বিতীয় পদ্ধতির এখানে উপস্থাপন https://www.slideshare.net/stormpath/rest-jsonapis

সংক্ষেপে, নেস্টেড রিসোর্সগুলিকে প্যারেন্ট রিসোর্সে লিঙ্ক হিসাবে অন্তর্ভুক্ত করুন, ইতিমধ্যে, প্যারেন্ট এন্ডপয়েন্টে একটি প্রসারিত প্যারামিটার সরবরাহ করুন।

আমার মতে, এটি এমন একটি উপায় যা বেশিরভাগ ক্ষেত্রে দক্ষ এবং নমনীয়।


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