RESTful API। আমি কি তৈরি করা / আপডেট করা বস্তুটি ফিরিয়ে আনব?


36

আমি ওয়েবএপিপি ব্যবহার করে একটি রেস্ট্রুলফুল ওয়েব পরিষেবা ডিজাইন করছি এবং অবজেক্ট আপডেট / তৈরি করার সময় এইচটিটিপি প্রতিক্রিয়া এবং প্রতিক্রিয়া সংস্থাগুলি কী ফিরে আসবে তা ভাবছিলাম।

উদাহরণস্বরূপ আমি ওয়েব পরিষেবাতে কিছু জেএসওএন প্রেরণ এবং তারপরে একটি অবজেক্ট তৈরি করতে POST পদ্ধতিটি ব্যবহার করতে পারি। তাহলে কি তৈরি করা (201) বা ঠিক (200) এ এইচটিটিপি স্থিতি সেট করা এবং "নতুন কর্মচারী যুক্ত হওয়া" এর মতো কোনও বার্তা দেওয়া বা মূলত পাঠানো অবজেক্টটি ফিরিয়ে দেওয়া ভাল অনুশীলন?

একই পুট পদ্ধতিতে যায়। কোন HTTP স্থিতিটি ব্যবহার করা সবচেয়ে ভাল এবং আমার কি তৈরি করা বস্তুটি বা কেবল একটি বার্তা ফেরত দেওয়া দরকার? ব্যবহারকারী যে কোনও উপায়ে যেভাবেই তৈরি / আপডেট করার চেষ্টা করছেন তা ব্যবহারকারী জানেন Cons

কোন চিন্তা?

উদাহরণ:

নতুন কর্মচারী যুক্ত করুন:

POST /api/employee HTTP/1.1
Host: localhost:8000
Content-Type: application/json

{
    "Employee": {
        "Name" : "Joe Bloggs",
        "Department" : "Finance"
    }
}

বিদ্যমান কর্মচারী আপডেট করুন:

PUT /api/employee HTTP/1.1
Host: localhost:8000
Content-Type: application/json

{
    "Employee": {
        "Id" : 1
        "Name" : "Joe Bloggs",
        "Department" : "IT"
    }
}

প্রত্যুত্তর:

প্রতিক্রিয়া তৈরি বস্তুর সাথে তৈরি / আপডেট হয়েছে

HTTP/1.1 201 Created
Content-Length: 39
Content-Type: application/json; charset=utf-8
Date: Mon, 28 Mar 2016 14:32:39 GMT

{
    "Employee": {
        "Id" : 1
        "Name" : "Joe Bloggs",
        "Department" : "IT"
    }
}

স্রেফ বার্তার সাথে প্রতিক্রিয়া:

HTTP/1.1 200 OK
Content-Length: 39
Content-Type: application/json; charset=utf-8
Date: Mon, 28 Mar 2016 14:32:39 GMT

{
    "Message": "Employee updated"
}

জাস্ট স্ট্যাটাস কোড সহ প্রতিক্রিয়া:

HTTP/1.1 204 No Content
Content-Length: 39
Date: Mon, 28 Mar 2016 14:32:39 GMT

2
ভাল প্রশ্ন, তবে "সেরা-অনুশীলন" শব্দটি ব্যবহার করা এই সাইটের মেটা.প্রগ্রামগ্রামার্স.স্ট্যাকেক্সেক্সঞ্জ / প্রশ্নগুলি / ২৪৪৪/২ / র ক্ষেত্রে নিষিদ্ধ You আপনি কেবল প্রশ্নটি পুনরায় শব্দ করতে চান। meta.programmers.stackexchange.com/questions/6967/…
স্নুপ

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

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

@ অ্যান্ড্রুপিলিজার আপনার ধারণা UPDATE/INSERT ... RETURNINGএসকিউএল-এর পোস্টগ্র্যাস্কিল ভেরিয়েন্টের সাথে খুব মিল । এটি অত্যন্ত সুবিধাজনক, বিশেষত এটি নতুন তথ্য জমা রাখে এবং আপডেট করা সংস্করণ পারমাণবিকের জন্য অনুরোধ করে।
বেলডাজ

উত্তর:


31

বেশিরভাগ জিনিসের মতো এটি নির্ভর করে। আপনার ট্রেড অফটি ব্যবহারের সহজতা বনাম নেটওয়ার্কের আকার। এটি তৈরি করা সংস্থানটি দেখতে ক্লায়েন্টদের পক্ষে খুব সহায়ক হতে পারে। এটিতে সর্বশেষ-নির্মাণের সময় যেমন সার্ভার দ্বারা জনবহুল ক্ষেত্র অন্তর্ভুক্ত থাকতে পারে। যেহেতু আপনি idব্যবহারের পরিবর্তে এটি অন্তর্ভুক্ত করছেন বলে মনে হয় hateoas, ক্লায়েন্টরা সম্ভবত তারা কেবলমাত্র POSTসম্পাদিত সংস্থান হিসাবে আইডিটি দেখতে চাইবে ।

আপনি যদি তৈরি করা সংস্থানটি অন্তর্ভুক্ত না করেন তবে দয়া করে একটি স্বেচ্ছাচারিত বার্তা তৈরি করবেন না। 2XX এবং অবস্থান ক্ষেত্রগুলি ক্লায়েন্টদের তাদের আস্থাটি সঠিকভাবে পরিচালিত হয়েছে বলে আস্থা রাখার জন্য পর্যাপ্ত তথ্য।


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

3
"দয়া করে একটি স্বেচ্ছাচারিত বার্তা তৈরি করবেন না" পরামর্শের উপর +1
হেয়ারআফ দ্যডোগ

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

12

ব্যক্তিগতভাবে, আমি সবসময় কেবল ফিরে আসি 200 OK

আপনার প্রশ্নের উদ্ধৃতি দিতে

ব্যবহারকারী যে কোনও উপায়ে যেভাবেই তৈরি / আপডেট করার চেষ্টা করছেন তা ব্যবহারকারী জানেন Cons

ক্লায়েন্টটি ইতিমধ্যে যা জানে তা জানাতে কেন অতিরিক্ত ব্যান্ডউইথ (যার জন্য অর্থ দিতে হতে পারে) যুক্ত করবেন?


1
আমি যা ভাবছিলাম তা যদি অবৈধ হয় তবে আপনি বৈধতা বার্তাগুলি ফিরিয়ে দিতে পারেন, তবে এটি বৈধ এবং তৈরি হয়ে / আপডেট হয়ে গেলে এইচটিটিপি স্থিতি কোডটি পরীক্ষা করে ব্যবহারকারীকে একটি বার্তা যেমন "
হুরয়ি

3
দেখুন stackoverflow.com/a/827045/290182 সংক্রান্ত 200/ 204 No ContentjQuery এবং মত বিভ্রান্তিকর এড়ানো।
বেলডাজ

10

@ আইসিংকি আমি পোস্ট এবং পুট উভয় ক্ষেত্রেই সর্বদা পেডলোডটি ফেরত পাঠাতাম।

পোস্টের ক্ষেত্রে আপনি কোনও অভ্যন্তরীণ আইডি বা কোনও ইউইউডি দিয়ে সত্তা তৈরি করতে পারেন। অতএব পেডলোডটি ফেরত পাঠানো বোধগম্য।

একইভাবে PUT এর ক্ষেত্রে, আপনি ব্যবহারকারীর কিছু ক্ষেত্র উপেক্ষা করতে পারেন (অপরিবর্তনীয় মান, বলুন), বা কোনও প্যাচচের ক্ষেত্রে, ডেটা অন্য ব্যবহারকারীরাও পরিবর্তন করেছেন changed

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

এটি কেবল একটি মোছার ক্ষেত্রেই যে আমি পেডলোডটি প্রেরণ করব না এবং একটি প্রতিক্রিয়া সামগ্রী সহ 200 বা একটি প্রতিক্রিয়ার সামগ্রী না করে 204 করব।

সম্পাদনা করুন: নীচে থেকে কিছু মন্তব্যে ধন্যবাদ, আমি আমার উত্তরটি পুনর্নির্মাণ করছি। আমি আমার এপিআইগুলি যেভাবে ডিজাইন করেছি এবং প্রতিক্রিয়াগুলি ফেরত পাঠিয়েছি তারপরেও আমি দাঁড়িয়ে আছি তবে আমি মনে করি এটি আমার কিছু ডিজাইন চিন্তাকে যোগ্য করে তোলা বোধগম্য।

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

খ) পে-লোড খুব বেশি হলে আমি প্রতিক্রিয়াগুলি প্রেরণ করব না। আমি মন্তব্যগুলিতে এটি নিয়ে আলোচনা করেছি, তবে আমি যে বিষয়টি সাবধান করতে চাই তা হ'ল আমি আমার API বা আমার সংস্থানগুলি এমনভাবে ডিজাইন করার জন্য যথাসাধ্য চেষ্টা করব যাতে এটির খুব বেশি পে-লোড না হয়। আমি সংস্থানগুলি আরও ছোট এবং পরিচালনাযোগ্য সত্তায় বিভক্ত করার চেষ্টা করব যাতে প্রতিটি সংস্থান 15-20 জেএসওএন গুণাবলী দ্বারা সংজ্ঞায়িত হয় এবং বৃহত্তর নয়।

যদি বিষয়টি খুব বড় হয় বা প্যারেন্ট অবজেক্ট আপডেট করা হয় তবে আমি নেস্টেড স্ট্রাকচারগুলি hrefs হিসাবে ফেরত পাঠাতে চাই।

নীচের লাইনটি আমি অবশ্যই গ্রাহক / ইউআইকে তাত্ক্ষণিকভাবে প্রক্রিয়া করার জন্য এবং পারমাণবিক এপিআই অ্যাকশনটি সম্পন্ন করার পরিবর্তে ইউআই পোস্টটি আপডেট করার জন্য আরও 2-5 টি আরও এপিআই আনতে হবে এমন ডেটা ফেরত পাঠানোর চেষ্টা করব the ডেটা তৈরি / আপডেট।

সার্ভার থেকে সার্ভার এপিআই এ সম্পর্কে আলাদাভাবে চিন্তা করতে পারে। আমি এমন এপিআইগুলিতে ফোকাস করছি যা ব্যবহারকারীর অভিজ্ঞতা চালায়।


আমি অনেকগুলি পরিস্থিতি দেখতে পাচ্ছি যেখানে পে-লোড বড় হলে পুরো পেডলোডটি ফেরত পাঠানো খারাপ ধারণা।
বেলডাজ

2
@ বেলডাজ সম্পূর্ণরূপে একমত REST এপিআই এর নকশার উপর ভিত্তি করে ওয়াইএমএমভি। আমি সাধারণত খুব বড় অবজেক্টগুলি এড়িয়ে চলে এবং এটিকে সাব-রিসোর্স / পিইটিগুলির একটি ধারাতে বিভক্ত করি। যদি পেডলোডটি খুব বড় হয় তবে এটি করার আরও ভাল উপায় রয়েছে এবং এর মধ্যে আপনি হেটোয়াস করতে চান (যেমন মারজান উপরে বলেছেন) যেখানে আপনি নিজের অবজেক্টের পরিবর্তে অবজেক্টের রেফারেন্স ফিরিয়ে দেন।
ksprashu

@ksprashu: "সুতরাং পেওলডটি ফেরত পাঠানো বুদ্ধিমান হয়েছে" - আমি মনে করি এটি একটি খারাপ ধারণা, কারণ এইভাবে বিভিন্ন উপায়ে একটি সংস্থান পাওয়া যায়: জিইটি এর মাধ্যমে, পিওএসটির প্রতিক্রিয়া হিসাবে, পিইটি এর প্রতিক্রিয়া হিসাবে। এর অর্থ হ'ল ক্লায়েন্ট সম্ভাব্য ভিন্ন কাঠামো সহ 3 সংস্থান লাভ করে । যেখানে আপনি কোনও দেহ ছাড়াই কেবল ইউআরআই (অবস্থান) ফিরিয়ে আনবেন, তবে কোনও উত্স পাওয়ার একমাত্র উপায় হ'ল জিইটি। এটি নিশ্চিত করবে যে ক্লায়েন্ট সর্বদা ধারাবাহিক প্রতিক্রিয়া গ্রহণ করে।
মেন্টালুর্গ

@mentallurg আমি বুঝতে পারি আমি এই অধিকারটি নাও বলতে পারি। এটা ইশারা জন্য ধন্যবাদ। আমি আমার উত্তর সম্পাদনা করেছি। যদি এটি আরও অর্থবোধ করে তবে আমাকে জানান।
ksprashu

যতক্ষণ আপনি নিজের বাড়ির কাজের জন্য কোনও পরিষেবা কার্যকর করেন, ততক্ষণ তা আসলে কিছু যায় আসে না। আপনার পছন্দ মতো করুন আপনার সময় বাঁচান।
মেন্টালুর্গ

9

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

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

@RequestMapping(path = "/employees", method = RequestMethod.POST)
public ResponseEntity<Object> saveEmployee(@RequestBody Employee employee) {
        int id = employeeService.saveEmployee(employee);
        URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(id).toUri();
        return ResponseEntity.created(uri).build();
}

এই বিশ্রামের শেষ পয়েন্টটি প্রতিক্রিয়া হিসাবে ফেরত দেবে:

অবস্থা 201 - তৈরি করা হয়েছে

শিরোনামের অবস্থান → http: // লোকালহোস্ট: 8080 / কর্মচারী / 1


সুন্দর এবং পরিষ্কার - এখন থেকে ওপারে এটিকে অনুসরণ করবে
হাসান তারেক

0

আমি কোনও HTTP প্যারামিটারে শর্তসাপেক্ষ রিটার্ন বডিতে পেডলোড করব।

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

প্রকৃতপক্ষে, আমাদের অ্যাপ্লিকেশনগুলি আরও ডেটা-নিবিড় এবং বিতরণ হওয়ার সাথে সাথে আমি এই গাইডলাইনটি পর্যবেক্ষণ করার চেষ্টা করছি:

আমার গাইডলাইন :

পোষ্ট বা পুটের পরপরই কোনও ব্যবহারের মামলা পাওয়া যায় যা পোষ্ট / পুটের প্রতিক্রিয়ায় কিছু ফিরিয়ে দেওয়া ভাল।

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

একটি অ্যাপ্লিকেশন কোনও পোস্ট বা PUT প্যারামিটারগুলির সেটকে সংজ্ঞায়িত করতে পারে প্রতিক্রিয়া শরীরে ফিরে আসার জন্য "সামগ্রী" প্রকারের নিয়ন্ত্রণ করতে পারে। বা এটি প্যারামিটার হিসাবে গ্রাফকিউল কোয়েরির কোনও ধরণের এনকোড করতে পারে (আমি এটি দরকারী হিসাবে দেখতে পাচ্ছি তবে এটি একটি রক্ষণাবেক্ষণের দুঃস্বপ্নও হয়ে উঠতে পারি))

যেভাবেই হোক, এটি আমার কাছে মনে হয়:

  1. কোনও পোষ্ট / পুট রেসপন্স বডিটিতে কিছু ফিরিয়ে দেওয়া ঠিক (এবং সম্ভবত কাম্য) is
  2. এটি কীভাবে করা হয় তা অ্যাপ্লিকেশন-নির্দিষ্ট এবং সাধারণকরণ প্রায় অসম্ভব।
  3. আপনি ডিফল্টরূপে বড় আকারের "প্রসঙ্গ" ফিরিয়ে দিতে চান না (ট্রাফিক-গোলমাল যা পিওএসটি-অনুসরণ-জিইটিগুলি থেকে সরে যাওয়ার পুরো কারণটিকে পরাস্ত করে))

সুতরাং, 1) এটি করুন, তবে 2) এটি সহজ রাখুন।

অন্য একটি বিকল্প আমি দেখেছি হ'ল লোকেরা বিকল্প সমাপ্তি পয়েন্টগুলি তৈরি করুন (বলুন, / পোষ্ট / পিইটি-র গ্রাহকরা যা শরীরে কিছুই দেয় না এবং / গ্রাহক_পথ / গ্রাহকদের কাছে / গ্রাহকদের কাছে থাকে না, তবে প্রতিক্রিয়া সংস্থায় কিছু ফিরে আসে))

যদিও আমি এই পদ্ধতির এড়াতে চাই। যখন আপনার বৈধভাবে বিভিন্ন ধরণের সামগ্রী ফিরে আসতে হবে তখন কী ঘটে? সামগ্রীর প্রকারে এক প্রান্ত পয়েন্ট? পরিবর্তনযোগ্য বা রক্ষণাবেক্ষণযোগ্য নয়।

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