একটি RESTful এপিআইতে প্রতিক্রিয়া হিসাবে অ্যারের ফিরিয়ে দেওয়ার সর্বোত্তম উপায় কী?


40

ধরে নিন আমাদের মতো সম্পদ রয়েছে,

book:
    type: object
    properties:
        author: {type: string}
        isbn: {type: string}
        title: {type: string}

books:
    type: array
    items: book

সুতরাং, যখন কেউ GETবইয়ের সংস্থানগুলি চালু করে, আমরা নিম্নলিখিতগুলি ফিরে আসব

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
 {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

আমি কর্মস্থলের কারও কাছ থেকে শুনেছি যে প্রস্তাবিত আরআরইএসটি অনুশীলন হ'ল জেএসওএন অবজেক্ট হিসাবে সর্বদা প্রতিক্রিয়া ফিরিয়ে দেওয়া, যার অর্থ এই যে আমাদের স্কিমাটি এর booksমতো দেখাবে,

books:
    type: object
    properties:
        list:
            type: array
            items: book

সুতরাং, এখন, প্রতিক্রিয়া দেখতে এই মত হবে,

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
             {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

এর মধ্যে কোনটি রেষ্ট রিস্টের সেরা?


1
JSON কি বিশ্রামে আছে? আপনি কি এইচটিএমএল ফিরে আসবেন?
ইভান

3
@ ইওয়ান: পেডলোড কিছু যায় আসে না। মাইম টাইমগুলি এটাই।
রবার্ট হার্ভে

1
রিস্টের জন্য সেরা অনুশীলনও নয়। REST হেটোয়াস দিয়ে তৈরি, যার অর্থ আপনার API এর আবিষ্কারযোগ্যতা। HAL বা JSON-LD সন্ধান করুন।
ফ্লোরিয়ান মার্জাইন

জসন-এলডি: ধীরে ধীরে ডাব্লুসিএফ
ইওয়ান

আমি কোনও জিনিসের অভ্যন্তরে জেএসএন এর অ্যারেগুলি মোড়ক থেকে পঠন করা পুরানো ব্রাউজারগুলির হ্যাকড / আর্কিভ /2009/06/25/json-hijacking.aspx - এর প্রতিবেদনিত দুর্বলতার বিরুদ্ধে একটি প্রতিরক্ষামূলক ব্যবস্থা । এটি আজকের আধুনিক ব্রাউজারগুলিতে স্থির হয়ে গেছে বলে মনে হয়। আমার অনুমানের চেয়ে আরও নিরাপদ ..
গিশু

উত্তর:


35

অনুশীলনে দ্বিতীয় বিকল্পটি সেরা অনুশীলন। এর কারণ হ'ল আপনি যখন কোনও অ্যারে ফিরিয়ে দেন তখন আপনি সংস্থানটি মোটেও প্রসারিত করতে পারবেন না।

উদাহরণস্বরূপ: আপনার যদি সমস্ত রেকর্ডের একটি সংখ্যা যুক্ত করতে হয় তবে আপনি ইতিমধ্যে অ্যারে পদ্ধতির সাহায্যে সম্পন্ন করেছেন।

যদি এটি একটি তালিকার এপিআইতে ঘটে থাকে তবে আপনি এটিকে সামঞ্জস্য রাখতে চান তাই সমস্ত বস্তু তৈরি করুন তবে আপনার এপিটি বিকাশকারীদের জন্য আরও সুসংগত এবং সহজ হয়ে উঠবে।

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

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


3
"ডেটা সম্পর্কে বাস্তব হওয়ার জন্য" + (এবং এখনও উপলব্ধি করে যে আরইএসটি-র জন্য আরও প্রযুক্তিগত, আরও সঠিক সংজ্ঞা রয়েছে)।
থ্রিডে

8

উভয়

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},{"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

এবং

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
         {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

বৈধ জেসন আমি মনে করি না যে এটির প্রয়োজন না হলে আপনার "তালিকা" যুক্ত করা উচিত, এটি এমনকি বিভ্রান্তিকর হতে পারে কারণ এটি অনুসরণ করে যা তালিকার পরিবর্তে অ্যারে হয়।

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


7

আপনি আপনার প্রতিক্রিয়া জেএসওনকে মেনে চলার কারণটি হ'ল জেএসওন একটি ডিফাক্টো স্ট্যান্ডার্ড; জেএসএন পার্সার যুক্ত যে কোনও ভাষা একে তুচ্ছভাবে পার্স করতে পারে এবং আপনি যদি জাভাস্ক্রিপ্ট ব্যবহার করছেন তবে জাভাস্ক্রিপ্ট এটি স্থানীয়ভাবে বোঝে তাই আপনার পার্সারের প্রয়োজন নেই।

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

আপনার জেএসওএন স্কিমাটির সাথে REST এর কোনও সম্পর্ক নেই। একটি স্কিমা একটি REST দৃষ্টিকোণ থেকে গ্রহণযোগ্য।


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

তাহলে তাতে কিছু যায় আসে না। আমি আমার উত্তর আপডেট করেছি।
রবার্ট হার্ভে

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

...and if you're using JavaScript, you don't even need a parser since JavaScript understands it natively.ভাল, হ্যাঁ এবং না। জেএসএন জাভাস্ক্রিপ্টের একটি উপসেট তবে evalপার্সার ব্যবহারের পরিবর্তে কল করা আপনাকে তাত্ক্ষণিকভাবে "জেএসএন" এর জন্য দূর্বল করে তোলে যাতে দূষিত কোড রয়েছে এবং পার্সিং সম্ভবত evalযেভাবেই হোক আরও কার্যকর ।
ডোভাল

5

একটি একক অর্থহীন কী "তালিকা" এবং একটি অ্যারের মান সহ একটি অভিধান অর্থহীন - পরিবর্তে একটি অ্যারে ফিরিয়ে দিন।

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

আপনি যদি নিশ্চিত হন যে প্রতিক্রিয়াটি কেবলমাত্র বইগুলির তালিকা হিসাবে ব্যাখ্যা করা হবে (যদি অনুরোধটি "আমাকে বইয়ের একটি তালিকা দিন") তবে কেবল একটি অ্যারে ঠিক আছে।


5

দ্বিতীয় বিকল্পটি সুরক্ষা কারণেও পছন্দের পদ্ধতি। পুরানো ব্রাউজারগুলির একটি সুরক্ষিত দুর্বলতা রয়েছে যা যদি কোনও JSON অ্যারে হিসাবে ফিরে আসে তবে ওয়েব ডেটাতে অন্যান্য জাভাস্ক্রিপ্ট কোডটিকে আপনার ডেটা চুরি করতে দেয়। সুতরাং historতিহাসিকভাবে সেরা অনুশীলন ছিল JSON অ্যারেগুলি না ফেরানো। আসলে, কিছু ফ্রেমওয়ার্ক ছিল যার "json-ify" ফাংশন আপনি কোনও অ্যারেতে পাস করার সময় ডিফল্টরূপে বিকল্প 2 পছন্দ করেন।

https://stackoverflow.com/questions/3503102/what-are-top-level-json-arrays-and-why-are-they-a-security-risk

http://ejohn.org/blog/re-securing-json/


1

উভয়ই জসন এবং রেস্টে মেনে চলেন। আমি আপনার ক্ষেত্রে বইগুলিতে তালিকা পরিবর্তন করে প্রতিক্রিয়াটিকে আরও বর্ণনামূলক করব। বা এর মতো কিছু:

{ "responceObject" : {

   results : 2,

    "Books": [
        {"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
        {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}
    ]

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