এই পরিস্থিতিতে আমি সর্বদা প্রথমে ইন্টারফেসটি মনে করি, তারপরে এটি সমর্থন করার জন্য পিএইচপি কোড লিখি।
- এটি একটি REST এপিআই, সুতরাং অর্থবহ HTTP স্থিতি কোডগুলি অবশ্যই আবশ্যক।
- আপনি ক্লায়েন্টের কাছে এবং পাঠানো হচ্ছে ধারাবাহিক, নমনীয় ডেটা স্ট্রাকচার চান।
আসুন যে সমস্ত জিনিস ভুল হতে পারে সেগুলির এবং তাদের এইচটিটিপি স্থিতির কোডগুলি সম্পর্কে ভাবি:
- সার্ভার একটি ত্রুটি ছুড়ে (500)
- প্রমাণীকরণ ব্যর্থতা (401)
- অনুরোধ করা সংস্থানটি পাওয়া যায় নি (404)
- আপনি যে ডেটাটি সংশোধন করছেন সেটি পরিবর্তন করা হয়েছে কারণ আপনি এটি লোড করেছেন (409)
- তথ্য সংরক্ষণের সময় বৈধতা ত্রুটি (422)
- ক্লায়েন্ট তাদের অনুরোধের হারকে ছাড়িয়ে গেছে (429)
- অসমর্থিত ফাইলের ধরণ (415)
দ্রষ্টব্য, আরও কিছু রয়েছে যা আপনি পরে গবেষণা করতে পারবেন।
বেশিরভাগ ব্যর্থতার শর্তগুলির জন্য, কেবলমাত্র একটি ত্রুটি বার্তা ফিরে আসতে পারে। 422 Unprocessable Entity
প্রতিক্রিয়া, যা আমি "বৈধতা ত্রুটি" জন্য ব্যবহার করেছি একটির বেশি ত্রুটি --- ফর্ম ক্ষেত্র প্রতি এক বা একাধিক ত্রুটি আসতে পারে।
ত্রুটির প্রতিক্রিয়াগুলির জন্য আমাদের একটি নমনীয় ডেটা কাঠামো প্রয়োজন।
উদাহরণ হিসাবে ধরুন 500 Internal Server Error
:
HTTP/1.1 500 Internal Server Error
Content-Type: text/json
Date: Fri, 16 Jan 2015 17:44:25 GMT
... other headers omitted ...
{
"errors": {
"general": [
"Something went catastrophically wrong on the server! BWOOP! BWOOP! BWOOP!"
]
}
}
সার্ভারে কিছু পোস্ট করার চেষ্টা করার সময় সাধারণ বৈধতা ত্রুটির সাথে বিপরীতে:
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/json
Date: Fri, 16 Jan 2015 17:44:25 GMT
... other headers omitted ...
{
"errors": {
"first_name": [
"is required"
],
"telephone": [
"should not exceed 12 characters",
"is not in the correct format"
]
}
}
তারা কী এখানে বিষয়বস্তুর ধরণ হচ্ছে text/json
। এটি ক্লায়েন্ট অ্যাপ্লিকেশনগুলিকে বলে যে তারা জেএসএন ডিকোডার দিয়ে প্রতিক্রিয়ার বডিটি ডিকোড করতে পারে। যদি, বলুন, একটি অভ্যন্তরীণ সার্ভার ত্রুটি ধরা পড়ে না এবং আপনার জেনেরিক "কিছু ঘটেছে" এর পরিবর্তে ওয়েব পৃষ্ঠাটি সরবরাহ করা হয় তবে বিষয়বস্তুর ধরণ এমন হওয়া উচিত text/html; charset=utf-8
যাতে ক্লায়েন্ট অ্যাপ্লিকেশনগুলি প্রতিক্রিয়া সংস্থাকে JSON হিসাবে ডিকোড করার চেষ্টা করবে না।
আপনার জেএসওএনপি প্রতিক্রিয়াগুলি সমর্থন করার প্রয়োজন না হওয়া পর্যন্ত এটি সমস্ত সন্ধান এবং ছিনতাইয়ের মতো দেখায় । 200 OK
ব্যর্থতার জন্য আপনাকে অবশ্যই একটি প্রতিক্রিয়া ফিরিয়ে দিতে হবে । এই ক্ষেত্রে আপনাকে সনাক্ত করতে হবে যে ক্লায়েন্টটি জেএসওএনপি প্রতিক্রিয়াটির জন্য অনুরোধ করছে (সাধারণত একটি ইউআরএল অনুরোধের প্যারামিটারটি সনাক্ত করে callback
) এবং ডেটা কাঠামোটি কিছুটা পরিবর্তন করে:
(জিইটি / পোস্টস / 123? কলব্যাক = ডিসপ্লে ব্লগপোস্ট)
<script type="text/javascript" src="/posts/123?callback=displayBlogPost"></script>
HTTP/1.1 200 OK
Content-Type: text/javascript
Date: Fri, 16 Jan 2015 17:44:25 GMT
... other headers omitted ...
displayBlogPost({
"status": 500,
"data": {
"errors": {
"general": [
"Something went catastrophically wrong on the server! BWOOP! BWOOP! BWOOP!"
]
}
}
});
তারপরে ক্লায়েন্টের প্রতিক্রিয়া হ্যান্ডলারের (একটি ওয়েব ব্রাউজারে) একটি বৈশ্বিক জাভাস্ক্রিপ্ট ফাংশন থাকা উচিত displayBlogPost
যা একক যুক্তি গ্রহণ করে। এই ফাংশনটি নির্ধারণ করতে হবে যে প্রতিক্রিয়া সফল হয়েছিল:
function displayBlogPost(response) {
if (response.status == 500) {
alert(response.data.errors.general[0]);
}
}
সুতরাং আমরা ক্লায়েন্ট কেয়ার করেছি। এখন, সার্ভারটির যত্ন নেওয়া যাক।
<?php
class ResponseError
{
const STATUS_INTERNAL_SERVER_ERROR = 500;
const STATUS_UNPROCESSABLE_ENTITY = 422;
private $status;
private $messages;
public function ResponseError($status, $message = null)
{
$this->status = $status;
if (isset($message)) {
$this->messages = array(
'general' => array($message)
);
} else {
$this->messages = array();
}
}
public function addMessage($key, $message)
{
if (!isset($message)) {
$message = $key;
$key = 'general';
}
if (!isset($this->messages[$key])) {
$this->messages[$key] = array();
}
$this->messages[$key][] = $message;
}
public function getMessages()
{
return $this->messages;
}
public function getStatus()
{
return $this->status;
}
}
সার্ভার ত্রুটির ক্ষেত্রে এটি ব্যবহার করতে:
try {
// some code that throws an exception
}
catch (Exception $ex) {
return new ResponseError(ResponseError::STATUS_INTERNAL_SERVER_ERROR, $ex->message);
}
অথবা ব্যবহারকারীর ইনপুট যাচাই করার সময়:
// Validate some input from the user, and it is invalid:
$response = new ResponseError(ResponseError::STATUS_UNPROCESSABLE_ENTITY);
$response->addMessage('first_name', 'is required');
$response->addMessage('telephone', 'should not exceed 12 characters');
$response->addMessage('telephone', 'is not in the correct format');
return $response;
এর পরে, আপনার কেবল এমন কিছু দরকার যা প্রত্যাবর্তিত প্রতিক্রিয়া অবজেক্টটি এনে জেএসএনে রূপান্তরিত করে এবং আনন্দদায়ক পথে প্রতিক্রিয়া প্রেরণ করে।