পোষ্টের সাহায্যে অনুরোধ তৈরি করুন, যা প্রতিক্রিয়াগুলিকে 200 বা 201 এবং সামগ্রী দেয়


125

ধরুন আমি একটি REST পরিষেবা লিখি যার উদ্দেশ্য একটি সিস্টেমে একটি নতুন ডেটা আইটেম যুক্ত করা।

আমি পোস্ট করতে পরিকল্পনা

http://myhost/serviceX/someResources

মনে করুন এটি কাজ করে, আমার কোন প্রতিক্রিয়া কোড ব্যবহার করা উচিত? এবং কি সামগ্রীতে আমি ফিরে আসতে পারে।

আমি এইচটিটিপি প্রতিক্রিয়া কোডগুলির সংজ্ঞাটি দেখছি এবং এই সম্ভাবনাগুলি দেখছি:

200: ক্রিয়নের ফলাফল বর্ণনা বা ধারণ করে এমন একটি সত্তা ফিরিয়ে দিন;

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

পরবর্তীটি এইচটিপি অনুমানের সাথে সামঞ্জস্যপূর্ণ আরও শোনায় তবে আমি কী পরিষ্কার তা স্পষ্ট নয়

প্রতিক্রিয়াটির মধ্যে এমন একটি সত্তা অন্তর্ভুক্ত থাকতে হবে যা সংস্থানসমূহের বৈশিষ্ট্য এবং অবস্থানের তালিকা রাখে

উপায়।

প্রস্তাবনা? ব্যাখ্যাগুলোর?

উত্তর:


77

ধারণাটিটি হ'ল প্রতিক্রিয়া সংস্থা আপনাকে একটি পৃষ্ঠা দেয় যা আপনাকে জিনিসটির সাথে লিঙ্ক করে:

201 তৈরি হয়েছে

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

এর অর্থ এই যে আপনি যদি একটি অন্তর্ভুক্ত করা হবে Locationপ্রতিক্রিয়ায় হেডার যে যেখানে আপনি নতুন তৈরি করা জানতে পারেন তার URL দেয় জিনিস :

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597

প্রতিক্রিয়া বডি

তারপর যেতে কি প্রতিক্রিয়ায় অন্তর্ভুক্ত করা উচিত উল্লেখ শরীর :

201 টি প্রতিক্রিয়া পেডলোড সাধারণত বর্ণিত সংস্থানগুলি সংস্থান করে describes

ব্রাউজারটি ব্যবহারকারী মানুষের জন্য, আপনি তাদের কিছু সন্ধান করতে পারেন এবং তাদের সদ্য নির্মিত উত্সটিতে ক্লিক করতে:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: text/html

Your answer has been saved! 
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.

পৃষ্ঠাটি কেবল একটি রোবট দ্বারা ব্যবহার করা হলে, প্রতিক্রিয়াটি কম্পিউটার পাঠযোগ্য হতে পারে তা বোঝা যায়:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/xml

<createdResources>
   <questionID>1860645</questionID>
   <answerID>36373586</answerID>
   <primary>/a/36373586/12597</primary>
   <additional>
      <resource>http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586</resource>
      <resource>http://stackoverflow.com/a/1962757/12597</resource>
   </additional>
</createdResource>

বা, যদি আপনি পছন্দ করেন:

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/36373586/12597
Content-Type: application/json

{ 
   "questionID": 1860645, 
   "answerID": 36373586,
   "primary": "/a/36373586/12597",
   "additional": [
      "http://stackoverflow.com/questions/1860645/create-request-with-post-which-response-codes-200-or-201-and-content/36373586#36373586",
      "http://stackoverflow.com/a/36373586/12597"
   ]
}

প্রতিক্রিয়া সম্পূর্ণ আপনার উপর নির্ভর করে; এটি ইচ্ছামত আপনি যা চান তা।

ক্যাশে বন্ধুত্বপূর্ণ

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

দেখুন অনুচ্ছেদ 7.2 অর্থ এবং এই ধরনের ETag এবং যাচাইকারী হেডার ক্ষেত্র, উদ্দেশ্য সেই বিষয়ে আলোচনার জন্য শেষ পরিবর্তন, একটি 201 প্রতিক্রিয়ায়।

HTTP/1.1 201 Created
Date: Sat, 02 Apr 2016 12:22:40 GMT
Location: http://stackoverflow.com/a/23704283/12597
Content-Type: text/html
ETag: JF2CA53BOMQGU5LTOQQGC3RAMV4GC3LQNRSS4
Last-Modified: Sat, 02 Apr 2016 12:22:39 GMT 

Your answer has been saved! 
Click <A href="https://stackoverflow.com/a/36373586/12597">here</A> to view it.

এবং ETagগুলি খাঁটি স্বেচ্ছাচারিত মান। যখন কোনও সংস্থান পরিবর্তন হয় (এবং ক্যাশেগুলি আপডেট করার দরকার হয়) তখন এগুলি হওয়া আলাদা that ETag সাধারণত একটি হ্যাশ (যেমন SHA2)। তবে এটি কোনও ডাটাবেস rowversionবা একটি বাড়ানো সংশোধন নম্বর হতে পারে। কিছু যে হবে পরিবর্তন যখন জিনিস পরিবর্তন।


এখন পর্যন্ত আপনি প্রতিক্রিয়া সবচেয়ে বোধগম্য বলে মনে হচ্ছে। আমি প্রতিক্রিয়াটির অ্যান্টোলজি সম্পর্কে কিছুটা উদ্বিগ্ন, তবে সেগুলি বাদ দিয়ে মনে হয় এটি অনুমানটির সবচেয়ে পরিপক্ক ব্যাখ্যার মতো। মানুষের / মেশিন আউটপুট পরিচালনা করার জন্য যদি কোনও ধরণের হালকা "প্রতিক্রিয়াশীল" উপায় থাকে তবে আমি আগ্রহী। তবে বেশিরভাগ ক্ষেত্রে আমি আপনার "আপনার নিজের ইনপুটকে ক্যাশে করা" পরামর্শ দিয়ে আগ্রহী। আমি জানি বেশিরভাগ ওয়েব অ্যাপ্লিকেশনগুলি সংস্থানটির 1: 1 সংস্করণ তৈরি করতে যাচ্ছে না। এমনকি যদি এটি স্ট্রিংয়ের মূলধনকে সাধারণকরণ করার মতো তুচ্ছ কিছু something আপনার জমা দেওয়া সংস্করণটিকে ইটাগ যে সংস্করণের বিপরীতে তৈরি করা হয়েছিল, সে হিসাবে আচরণ করা কি কিছুটা অবাক নয়?
অ্যান্টনি

1
@ অ্যান্টনি, ক্যাশিং: এটি এক ধরণের 1: 1 ফাইল স্টোরেজ অ্যাপ্লিকেশন হতে পারে। যেমন WebDAV পুট এবং পোস্টের তুলনা করুন are হ্যান্ডল করার জন্য বিশাল ফাইল।
কেএক্সআর

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

আপনার প্রতিক্রিয়া কেন সামগ্রীর দৈর্ঘ্য অনুপস্থিত?
ভিনি ফ্যালকো

1
@ ভিনিফালকো এটি ২০১২ সালের প্রতিক্রিয়া কোড সম্পর্কে একটি উত্তর। বিষয়বস্তুর দৈর্ঘ্য এক্সপোজারিটরি উদ্দেশ্যে আলাদা করা হয়েছে।
আয়ান বয়ড

91

আমি মনে করি atompub REST এপিআই একটি বিশ্রামের পরিষেবার একটি দুর্দান্ত উদাহরণ। অ্যাটম্পাব স্পেক থেকে নীচে স্নিপেটটি দেখুন:

POST /edit/ HTTP/1.1
Host: example.org
User-Agent: Thingio/1.0
Authorization: Basic ZGFmZnk6c2VjZXJldA==
Content-Type: application/atom+xml;type=entry
Content-Length: nnn
Slug: First Post

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
</entry>

সার্ভারটি একটি 201 এর স্থিতি কোড সহ একটি সফল তৈরির সংকেত দেয় The

HTTP/1.1 201 Created
Date: Fri, 7 Oct 2005 17:17:11 GMT
Content-Length: nnn
Content-Type: application/atom+xml;type=entry;charset="utf-8"
Location: http://example.org/edit/first-post.atom
ETag: "c180de84f991g8"  

<?xml version="1.0"?>
<entry xmlns="http://www.w3.org/2005/Atom">
  <title>Atom-Powered Robots Run Amok</title>
  <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
  <updated>2003-12-13T18:30:02Z</updated>
  <author><name>John Doe</name></author>
  <content>Some text.</content>
  <link rel="edit"
      href="http://example.org/edit/first-post.atom"/>
</entry>

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


9
উত্সটি যদি গিগাবাইট
টোর ভ্যালামো

10
একমত! এটি প্রয়োজনীয়তার অপটিমাইজেশন - তবে আপনি অকালপূর্বক এটি করতে চান না। বিশ্রাম প্রফুল্ল্যে নকশা করা এবং যখন প্রয়োজনীয় হয় তখনই ব্যতিক্রম করা গুরুত্বপূর্ণ।
চন্দ্র পাটনি

3
@ চন্দ্রপাটনি, পরমাণু মারা গেছে । আরও ভাল উদাহরণ প্রয়োজন।
পেসারিয়ার

16
পরমাণু মারা যেতে পারে তবে উদাহরণের স্পিরিট এখনও পাওয়া যায়।
আশিমা

2
আমার ২০১২ সালের প্রতিক্রিয়ার মূল ব্যাখ্যাটি হ'ল "আরে, আপনি কোনও সংস্থান তৈরি করতে চেয়েছিলেন, তবে প্রসঙ্গের ভিত্তিতে আপনি হয় চূড়ান্ত ফলাফলের প্রতি আগ্রহী নন, অথবা লেখার অ্যাক্সেস পেয়েছেন তবে এই উত্সটিতে অ্যাক্সেস পড়েন নি either তবে মূল সংগ্রহে ফিরে আসার আগে আপনার যা দরকার তা হ'ল তৈরি সম্পদটির URL evidence প্রমাণ হিসাবে এটি তৈরি করা হয়েছিল। " এর বাইরে যে কোনও কিছুই 200 জবাবের মতো বলে মনে হচ্ছে মূলত। আরএফসি না থাকলে অন্য কিছু মনে থাকে।
অ্যান্টনি

50

কয়েকটি কথায়:

  • 200 যখন কোনও বস্তু তৈরি এবং ফিরে আসে
  • 201 যখন কোনও বস্তু তৈরি করা হয় তবে কেবলমাত্র তার রেফারেন্সই ফিরে আসে (যেমন কোনও আইডি বা কোনও লিঙ্ক)

এর জন্য উত্স?
সুডো আত্মা


3
টুলস.এইটিএফ.আর.জি.এইচটিএমএল / আরএফসি 7231 # সেকশন-6.3.3.1 পড়ার পরে , আমি এই বোঝার সাথে একমত - আমি মনে করি আপনি আরও কীভাবে এসেছেন তা আমি জিজ্ঞাসা করছি। তবে এখন আমার বুঝতে ... 200 = উত্স তৈরি এবং ফিরে | 201 = সংস্থান তৈরি হয়েছে এবং রেফারেন্স ফিরে এসেছে | 204 = সংস্থান তৈরি হয়েছে এবং কোনও পে-লোড ফিরে আসেনি
sudo আত্মার

34

পরীক্ষা করে দেখুন HTTP- র: পদ্ধতি সজ্ঞা পোষ্ট

POST পদ্ধতি দ্বারা সম্পাদিত ক্রিয়াকলাপের ফলে এমন কোনও সংস্থান দেখা যায় না যা কোনও ইউআরআই দ্বারা চিহ্নিত করা যায়। এই ক্ষেত্রে, 200 (ঠিক আছে) বা 204 (কোনও বিষয়বস্তু নয়) উপযুক্ত প্রতিক্রিয়ার স্থিতি, প্রতিক্রিয়ার ফলে ফলাফলটি বর্ণিত কোনও সত্তা অন্তর্ভুক্ত কিনা তা নির্ভর করে।

যদি উত্স সার্ভারে কোনও উত্স তৈরি করা থাকে, তবে প্রতিক্রিয়াটি 201 (হওয়া উচিত) হওয়া উচিত এবং এতে একটি সত্তা থাকতে হবে যা অনুরোধের স্থিতি বর্ণনা করে এবং নতুন সংস্থান এবং একটি অবস্থান শিরোনাম (বিভাগ 14.30 দেখুন)।


18

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19

এটি কেবল একটি কোলনের সীমানাঙ্কিত কী-মান।

ইটাগ: "xyzzy"

এটি কোনও প্রকারের পাঠ্য ডেটা হতে পারে - আমি সাধারণত তৈরি করা আইটেমটির শনাক্তকারী সহ একটি JSON স্ট্রিং অন্তর্ভুক্ত করি। একা পরীক্ষার স্বাচ্ছন্দ্যই এটি সার্থক করে তোলে।

ETag: "{ id: 1234, uri: 'http://domain.com/comments/1234', type: 'comment' }"

এই উদাহরণে, সনাক্তকারী, ইউরি এবং তৈরি আইটেমের ধরণ হ'ল "সংস্থার বৈশিষ্ট্য এবং অবস্থান"।


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

"রিসোর্সের বৈশিষ্ট্য এবং অবস্থানগুলির তালিকা" হ'ল ডেটা স্ট্রাকচারের সরবরাহ করা বিষয়বস্তু। আরও শক্তিশালী বাস্তবায়ন হ'ল জেএসওএন কাঠামোর জন্য রিসোর্স ইউরি অন্তর্ভুক্ত করা এবং সম্ভবত যে ধরণের সংস্থান তৈরি হয়েছিল। আমি উত্তরটি ঠিক তেমনভাবে সামঞ্জস্য করব।
টায়ার করুন

7
সমস্যাগুলি নির্দিষ্ট করুন, যাতে লোকেরা শিখতে পারে। অন্যথায়, মন্তব্যটি কেবল হাত বোলানো।
টায়ার্ড

@ সিমোনগিবস কি সমস্যা?
মেমার্ক

2
যদিও এটি অনুমান অনুযায়ী কঠোরভাবে সঠিক, এটি একটি অত্যন্ত অস্বাভাবিক বাস্তবায়ন বিকল্পের প্রস্তাব দেয়। এছাড়াও এটি পৃষ্ঠার শীর্ষে প্রশ্নের উত্তর দেয় না (অথবা এটি এটিটাগ এবং সত্তা শব্দটি মিশ্রিত করে)। 43 টি ভোট সহ উত্তর সম্ভবত ভাল।
সাইমন গিবস

1

আউটপুটটি আসলে অনুরোধ করা সামগ্রীর ধরণের উপর নির্ভরশীল। তবে, সর্বনিম্ন আপনার সেই উত্সটি অবস্থানটিতে তৈরি করা উচিত। পোস্ট-রিডাইরেক্ট-গেট প্যাটার্নের মতোই।

আমার ক্ষেত্রে আমি অন্যথায় অনুরোধ না করা অবধি খালি রেখে দেই। যেহেতু রেসপন্স ক্রিয়েটেড () ব্যবহার করার সময় জ্যাক্স-আরএসের আচরণ।

তবে, কেবল লক্ষ্য করুন যে অ্যাঙ্গুলারের মতো ব্রাউজারগুলি এবং ফ্রেমওয়ার্কগুলি স্বয়ংক্রিয়ভাবে 201 এর অনুসরণ করে না। আমি http://www.trajano.net/2013/05/201-created-with-angular-resource/ এ আচরণটি উল্লেখ করেছি


-2

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

আপনার উপরের প্রশ্নে আরও সুনির্দিষ্ট হওয়ার জন্য, আমি কেবল রিটার্ন কোডটি ব্যবহার করব 200 এবং ফিরে আসা বার্তায় একটি JSON বার্তা রয়েছে যা আপনার অ্যাপ্লিকেশন বুঝতে পারে। আপনার প্রয়োজনের উপর নির্ভর করে এটির জন্য নতুন তৈরি হওয়া অবজেক্টের আইডি লাগতে পারে যাতে ওয়েব অ্যাপ্লিকেশন অন্য কলটিতে ডেটা পেতে পারে।

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

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