Форматы ответа на запросы

Всё что касается построения API
Ответить
rafic
Сообщения: 57
Зарегистрирован: 2013.04.26, 13:19

Форматы ответа на запросы

Сообщение rafic »

Разрабатываю API впервые.
Меня интересуют различные варианты ответа на запрос и способы реализации в Yii.

Три самых распространенных типа ответа:
1. Прошло успешно - 200 OK
2. Ошибка валидации - 400 Bad request
3. Ошибка на стороне сервера - 500 Internal Server Error

Как я понимаю, все ошибки должны быть в одном формате.
Определять есть ошибка или нет буду по коду ответа. Если не 200 тогда тело ответа = тело ошибки.

Подскажите как правильно и грамотно отдавать эти варианты ошибок?
Какие есть методики и форматы выдачи ошибки на интерфейс?
Другие советы и соображения по данному поводу=)
Ищу разработчика или команду разработчиков для поддержки проекта.
Детальнее узнай по ссылке https://goo.gl/YU8uTS.
Аватара пользователя
MetaDriver
Сообщения: 43
Зарегистрирован: 2014.04.21, 20:53
Откуда: Казань

Re: Форматы ответа на запросы

Сообщение MetaDriver »

rafic писал(а):Разрабатываю API впервые.
Меня интересуют различные варианты ответа на запрос и способы реализации в Yii.
..........
Подскажите как правильно и грамотно отдавать эти варианты ошибок?
Какие есть методики и форматы выдачи ошибки на интерфейс?
Другие советы и соображения по данному поводу=)
http://habrahabr.ru/post/181988/
Там немного насчёт кодов ошибок, и много всяких других полезных соображений по принципам разработки Апи.
Если ещё что-то подобное нароете, сбросьте пожалуйста сюда же, мне будет полезно и интересно почитать.
Что касается реализации на Yii - здесь я малополезен, тоже впервые делаю, пока обхожусь "стандартными" реакциями ActiveController'a, но если приспичит - буду крутиться дальше.. :)
rafic
Сообщения: 57
Зарегистрирован: 2013.04.26, 13:19

Re: Форматы ответа на запросы

Сообщение rafic »

Вот говорила мне бабушка - "Внучек, читай доку внимательнее. За тебя уже все придумали."
Так и тут вышло)
http://www.yiiframework.com/doc-2.0/gui ... dling.html

Получается вот что:
1. Если все Ок, то возвращаем 200 ОК и тело ответа.
2. Если ошибка - тогда используем один из вариантов:
Ошибка валидации - http://www.yiiframework.com/doc-2.0/yii ... ption.html
Ошибка сервера - http://www.yiiframework.com/doc-2.0/yii ... ption.html

Насчет валидации... что, если ошибки возникли по нескольким полям?
Я так полагаю, что нужно выкидывать Exception по каждому сообщению валидации отдельно.
Это будет логично и просто в реализации... но удобно ли пользователям API?

UPD. Вот что я использую для отдачи ошибок.

Код: Выделить всё

<?php
/**
 * Created by PhpStorm.
 * User: Vitaly Voskobovich
 * Date: 16.05.14 14:41
 */
namespace app\components\helpers;

use yii\web\HttpException;
use yii\web\ForbiddenHttpException;
use yii\web\NotFoundHttpException;
use yii\web\BadRequestHttpException;


class HttpError
{
    /**
     * Вызывает ошибку входящих данных - Code 400
     * @param string $value
     * @throws HttpException
     */
    public static function the400($value = 'Bad Request')
    {
        if(is_array($value))
        {
            foreach($value as $field => $messages)
            {
                foreach($messages as $message)
                {
                    $value = "{$field} - {$message}";
                    break;
                }
                break;
            }
        }

        throw new BadRequestHttpException($value);
    }

    /**
     * Вызывает ошибку отсутствия записи - Code 404
     * @param string $message
     * @throws NotFoundHttpException
     */
    public static function the404($message = 'Not Found')
    {
        throw new NotFoundHttpException($message);
    }

    /**
     * Вызывает ошибку доступа - Code 403
     * @param string $message
     * @throws ForbiddenHttpException
     */
    public static function the403($message = 'Forbidden')
    {
        throw new ForbiddenHttpException($message);
    }

    /**
     * Вызывает ошибку сервера - Code 500
     * @param string $message
     * @throws \yii\web\HttpException
     */
    public static function the500($message = 'Internal Server Error')
    {
        throw new HttpException(500, $message);
    }
} 
Ищу разработчика или команду разработчиков для поддержки проекта.
Детальнее узнай по ссылке https://goo.gl/YU8uTS.
Ответить