REST API ত্রুটি প্রতিক্রিয়া মডেল এবং ত্রুটি কোড সিস্টেম তৈরি করার সর্বোত্তম উপায় কী?


15

আমার REST বাস্তবায়ন পরবর্তী কাঠামোর সাথে JSON এ ত্রুটিগুলি ফিরিয়ে দেবে:

{
 "http_response":400,
 "dev_message":"There is a problem",
 "message_for_user":"Bad request",
 "some_internal_error_code":12345
}

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

$responseModel = new MyResponseModel(400,"Something is bad", etc...);

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

দ্বিতীয় অংশটি ত্রুটি কোড সিস্টেম সম্পর্কে। ত্রুটি কোডগুলি ডকুমেন্টেশনে বর্ণিত হবে। তবে আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল কোড। ত্রুটি কোডগুলি পরিচালনা করার সর্বোত্তম উপায় কী? আমি তাদের মডেল ভিতরে লিখতে হবে? অথবা এটি পরিচালনা করার জন্য আলাদা পরিষেবা তৈরি করা ভাল কি?

আপডেট 1

আমি প্রতিক্রিয়া জন্য মডেল ক্লাস প্রয়োগ করেছি। এটি একই ধরণের গ্রেগের উত্তর, একই যুক্তিযুক্ত, তবে সংযোজনে আমি মডেলটিতে লিখিত ত্রুটিগুলি হার্ডকোড করেছি এবং এখানে এটি দেখতে কেমন দেখাচ্ছে:

    class ErrorResponse
    {
     const SOME_ENTITY_NOT_FOUND = 100;
     protected $errorMessages = [100 => ["error_message" => "That entity doesn't exist!"]];

     ...some code...
    }

কেন আমি এটা করেছি? আর কিসের জন্য?

  1. এটি কোডে দুর্দান্ত দেখাচ্ছে: return new ErrorResponse(ErrorResponse::SOME_ENTITY_NOT_FOUND );
  2. ত্রুটির বার্তা পরিবর্তন করা সহজ। সমস্ত বার্তা নিয়ামক / পরিষেবা / ইত্যাদির পরিবর্তে বা আপনি যা কিছু রেখেছেন তা এক জায়গায়।

এটি উন্নত করার জন্য আপনার যদি কোনও পরামর্শ থাকে তবে মন্তব্য করুন।

উত্তর:


13

এই পরিস্থিতিতে আমি সর্বদা প্রথমে ইন্টারফেসটি মনে করি, তারপরে এটি সমর্থন করার জন্য পিএইচপি কোড লিখি।

  1. এটি একটি REST এপিআই, সুতরাং অর্থবহ HTTP স্থিতি কোডগুলি অবশ্যই আবশ্যক।
  2. আপনি ক্লায়েন্টের কাছে এবং পাঠানো হচ্ছে ধারাবাহিক, নমনীয় ডেটা স্ট্রাকচার চান।

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

  • সার্ভার একটি ত্রুটি ছুড়ে (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;

এর পরে, আপনার কেবল এমন কিছু দরকার যা প্রত্যাবর্তিত প্রতিক্রিয়া অবজেক্টটি এনে জেএসএনে রূপান্তরিত করে এবং আনন্দদায়ক পথে প্রতিক্রিয়া প্রেরণ করে।


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

-2

আমি একইরকম কিছু মুখোমুখি হয়েছি, আমি তিনটি জিনিস করেছি,

  1. আমার জন্য এবিসিএক্সেপশন নামে একটি এক্সসেপশনহ্যান্ডলার তৈরি করেছেন।

যেহেতু আমি জাভা এবং স্প্রিং ব্যবহার করছি,

আমি এটি হিসাবে সংজ্ঞায়িত

 public class ABCException extends Exception {
private String errorMessage;
private HttpStatus statusCode;

    public ABCException(String errorMessage,HttpStatus statusCode){
            super(errorMessage);
            this.statusCode = statusCode;

        }
    }

তারপরে এটিকে যেখানে প্রয়োজন সেখানে ডেকে আনি,

throw new ABCException("Invalid User",HttpStatus.CONFLICT);

এবং হ্যাঁ, আপনি যদি আরইএসটি ভিত্তিক ওয়েব সার্ভিস ব্যবহার করে থাকেন তবে আপনার নিয়ামকটিতে আপনাকে এক্সপেশনহ্যান্ডলার তৈরি করতে হবে।

@ExceptionHandlerস্প্রিং ব্যবহার করে তা দিয়ে এনেটেট করুন


প্রোগ্রামাররা হয় সম্পর্কে ধারণাগত প্রশ্ন ও উত্তর হয় বলে আশা করা ব্যাখ্যা জিনিষ । ব্যাখ্যার পরিবর্তে কোড ডাম্প নিক্ষেপ করা আইডিই থেকে হোয়াইটবোর্ডে কোড অনুলিপি করার মতো: এটি পরিচিত এবং এমনকি কখনও কখনও বোধগম্য হতে পারে তবে এটি অদ্ভুত বোধ করে ... ঠিক অদ্ভুত। হোয়াইটবোর্ডের সংকলক নেই
gnat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.