इस स्थिति में, मैं हमेशा पहले इंटरफ़ेस के बारे में सोचता हूं, फिर समर्थन करने के लिए PHP कोड लिखता हूं।
- यह एक वास्तविक एपीआई है, इसलिए सार्थक HTTP स्थिति कोड एक होना चाहिए।
- आप क्लाइंट से लगातार और लचीली डेटा संरचनाएँ भेजना चाहते हैं।
आइए उन सभी चीजों के बारे में सोचें जो गलत हो सकती हैं और उनके 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
। यह क्लाइंट एप्लिकेशन को बताता है कि वे JSON डिकोडर के साथ प्रतिक्रिया बॉडी को डीकोड कर सकते हैं। यदि कहते हैं, एक आंतरिक सर्वर त्रुटि पकड़ा नहीं है और अपने सामान्य "कुछ गलत हो गया" वेब पेज के बजाय दिया जाता है, सामग्री प्रकार होना चाहिएtext/html; charset=utf-8
ताकि क्लाइंट एप्लिकेशन प्रतिक्रिया बॉडी को JSON के रूप में डिकोड करने का प्रयास न करें।
जब तक आपको JSONP प्रतिक्रियाओं का समर्थन करने की आवश्यकता होती है, तब तक यह सभी खोज और बांका दिखता है । आपको 200 OK
विफलताओं के लिए भी एक प्रतिसाद देना चाहिए । इस स्थिति में आपको पता लगाना होगा कि क्लाइंट JSONP रिस्पांस का अनुरोध कर रहा है (आमतौर पर URL अनुरोध पैरामीटर का पता लगाने के लिए)callback
) और डेटा संरचना को थोड़ा बदलकर:
(GET / पोस्ट / 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;
उसके बाद, आपको बस कुछ ऐसा चाहिए जो लौटी हुई प्रतिक्रिया वस्तु लेता है और इसे JSON में रूपांतरित करता है और प्रतिक्रिया को उसके मीरा मार्ग पर भेजता है।