Рубрики
Uncategorized

Способ работы Yii – HTTP-запрос и ответ

Автор оригинала: David Wong.

Набросок

HTTP-взаимодействие в основном делится на запрос (request) и ответ (response).

  • Для Yii2 запрос HTTP – запроса представлен YII:$app – > запрос, который является подключаемым модулем для обработки HTTP-запроса, предоставленного Yii. В нем есть много практических кодов функций:

php
        $request = \YII::$app->request;
        if ($request->isGet) {
            Echo $request - > get ('id','Get gets'values are empty');
        } else if ($request->isPost) {
            $request - > post ('name','post passes empty');
        }   
        Echo $request - > userIp; // Get the current IP address
?>
  • Для Yii2 запросы HTTP – ответов представлены YII:$app – > response, который является подключаемым модулем для обработки запросов HTTP – ответов, предоставляемых Yii. Он содержит много полезных функциональных кодов:

response;
        // Set the status code settings returned by the server
        $response->statusCode = '404';
        // Set pragma settings to remind browsers not to set caches
        $response->headers->add('pragma', 'no-chche');
        // Set pragma settings to remind browsers to set caching for 5 seconds
        $response->headers->set('pragma', 'max-age=5');
        $response->headers->remove('pragma');
        // Setting pages to jump to the specified path
        $response->headers->add('location', 'https://rongx.github.io');
        // Set the page Jump and the status code to 302 (call the method in Controller)
        $this->redirect('https://rongx.github.io', 302);
        // Setting File Download Links
        $response->headers->add('content-dispostion', 'attachment; filename="a.jpg"');
        // Provide file download, file path is relative to the entry file.
        $response->sendFile('./b.jpg');
?>
  • На самом деле, существует множество функциональных кодов подключаемых модулей для обработки HTTP в yii веб-контроллере.

Параметр запроса

Чтобы получить параметры запроса, вы можете вызвать метод yii web Request:: get () и метод yii web Request:: post () компонента запроса. Они возвращают значения $_GET и $_POST соответственно.

$request = Yii::$app->request;

$get = $request->get(); 
// Equivalent to: $get = $GET;

$id = $request->get('id');   
// Equivalent to: $id = isset ($_GET ['id'])? $_GET ['id']: null;

$id = $request->get('id', 1);   
// Equivalent to: $id = isset ($_GET ['id'])? $_GET ['id']: 1;

$post = $request->post(); 
// Equivalent to: $post = $_POST;

$name = $request->post('name');   
// Equivalent to: $name = isset ($_POST ['name'])? $_POST ['name']: null;

$name = $request->post('name', '');   
// Equivalent to: $name = isset ($_POST ['name'])? $_POST ['name']:';
  • Информация: Рекомендуется использовать компонент запроса для получения параметров запроса, как указано выше, вместо прямого доступа к $_GET и $_POST.

  • Информация: Это облегчает написание тестовых примеров, поскольку вы можете забыть данные для создания компонента макетного запроса.

При реализации интерфейса API RESTful часто требуется, чтобы параметры отправлялись с помощью PUT, ИСПРАВЛЕНИЯ или других методов запроса.

Вы можете получить эти параметры, вызвав веб-запрос yii:: getBodyParam (). Например:

$request = Yii:: $app - > request; // Returns all parameters 
$params = $request - > body Params; // Return parameter "id"
$param = $request->getBodyParam('id');
  • Информация: В отличие от параметров GET, POST, PUT, PATCH и т. Д., отправленные параметры отправляются в теле запроса.

  • Информация: Когда вы получаете доступ к этим параметрам с помощью методов, описанных выше, компонент запроса анализирует их.

  • Информация: Вы можете настроить способ анализа этих параметров, настроив атрибут yii web Request:: parsers.

Вы можете использовать выражение запроса, чтобы получить метод HTTP, используемый для текущего запроса.

Также предоставляется набор логических атрибутов для определения того, что текущий запрос относится к определенному типу. Например:

$request = Yii::$app->request;

If ($request - > isAjax) {/* This request is an AJAX request */}
If ($request - > isGet) {/* Request method is GET */}
If ($request - > isPost) {/* Request method is POST */}
If ($request - > isPut) {/* Request method is PUT */}

Компонент запроса предоставляет множество способов определения URL-адреса текущего запроса.

Предполагая, что запрошенный URL-адрес есть, вы можете получить части URL-адреса, как описано ниже:

  • Веб-запрос Yii:: url: Возвращает/администратор/индекс. PHP/продукт?, который не включает раздел информации о хосте.

  • Веб-запрос Yii:: абсолютный Url: Возвращает, включая весь URL-адрес индекса хоста.

  • Веб-запрос Yii:: hostInfo: Возврат к http://example.com, только с разделом информации о хосте.

  • Веб-запрос Yii:: pathInfo: Возврат/продукт, который является частью после сценария ввода и перед знаком вопроса (строка запроса).

  • Веб-запрос Yii:: строка запроса: Возвращается после знака вопроса.

  • Веб-запрос Yii:: baseUrl: Вернуться в/admin, после информации о хосте, перед сценарием ввода.

  • Веб-запрос Yii:: Сценарий: Возвращает/администратор/индекс. php, без информации о пути и частей строки запроса.

  • Веб-запрос Yii:: Имя сервера: Возврат к example.com, имя хоста в URL-адресе.

  • Веб-запрос Yii:: Порт сервера: Возвращает 80, который является портом, используемым в веб-службах.

Вы можете получить информацию о заголовке HTTP из свойства yii web Request:: headers, возвращаемого коллекцией yiiwebHeaderCollection. Например:

// Headers is a yii web HeaderCollection object
$headers = Yii::$app->request->headers;

// Returns the Accept header value
$accept = $headers->get('Accept');

If ($headers - > has ('User-Agent') {/* This is a User-Agent header */}

Компоненты запроса также предоставляют методы для поддержки быстрого доступа к общим заголовкам, включая:

  • Компоненты запроса также предоставляют методы для поддержки быстрого доступа к общим заголовкам, включая:

  • Веб-запрос Yii:: ContentType: Возвращает значение заголовка типа содержимого, которое является данными типа MIME в теле запроса.

  • Веб-запрос Yii:: Приемлемые типы содержимого: Возвращает допустимые для пользователя типы MIME содержимого. Возвращаемые типы сортируются по их показателям качества. Тип с наибольшим количеством баллов будет возвращен первым.

  • Веб-запрос Yii:: приемлемые языки: Возвращает язык, приемлемый для пользователя. Возвращаемые языки сортируются в соответствии с их иерархией предпочтений. Первый параметр представляет язык с наивысшим приоритетом.

Если ваше приложение поддерживает несколько языков и вы хотите отображать страницы на любимом языке конечного пользователя, вы можете использовать метод согласования языков yiiwebRequest:: getPreferred Language ().

Этот метод использует веб-запрос yii:: приемлемые языки для сравнения и фильтрации списка поддерживаемых языков в вашем приложении и возврата наиболее подходящего языка.

  • Совет: Вы также можете использовать фильтр yii filters ContentNegotiator для динамического определения типов контента и языков, которые следует использовать в ответе. Этот фильтр реализует свойства и методы согласования содержимого, описанные выше.

Вы можете получить имя хоста и IP-адрес клиента через веб-запрос yii:: хост пользователя и веб-запрос yii:: userIp соответственно.

$userHost = Yii::$app->request->userHost;
$userIP = Yii::$app->request->userIP;

Когда приложение завершает обработку запроса, объект ответа веб-ответа yii генерируется и отправляется объекту ответа конечного пользователя, который содержит такую информацию, как код состояния HTTP, заголовок HTTP и содержимое тела.

Конечная цель разработки веб-приложений, по сути, состоит в том, чтобы построить эти объекты ответа в соответствии с различными запросами.

В большинстве случаев он имеет дело в основном с компонентами приложения ответа, унаследованными от веб-ответа yii, но даже в этом случае Yii позволяет вам создать свой собственный объект ответа и отправить его конечному пользователю.

При построении ответа первое, что нужно сделать, – это определить, был ли запрос успешно обработан. Вы можете установить атрибут yii web Response:: StatusCode, который использует действительный код состояния HTTP.

Например, чтобы определить, что обработка была успешно обработана, код состояния 200 может быть установлен следующим образом:

Yii::$app->response->statusCode = 200;

Тем не менее, в большинстве случаев нет необходимости явно задавать код состояния, поскольку код состояния yiiwebResponse:: по умолчанию равен 200. Если запрос завершается неудачно, может быть выдано соответствующее исключение HTTP, как показано ниже:

throw new \yii\web\NotFoundHttpException;

Когда обработчик ошибок улавливает исключение, он извлекает код состояния из исключения и присваивает его ответу. Для вышеупомянутого исключения yii web NotFoundHttpException, соответствующего коду состояния HTTP 404, следующее исключение HTTP предопределено Yii:

  • исключение yii web BadRequestHttpException: код состояния 400.

  • исключение yii web conflicttpexception: код состояния 409.

  • исключение yii web ForbiddenHttpException: код состояния 403.

  • исключение yii web GoneHttpException: код состояния 410.

  • веб-метод yii Не разрешен Исключение HttpException: код состояния 405.

  • исключение yii web NotAcceptableHttpException: код состояния 406.

  • исключение yii web NotFoundHttpException: код состояния 404.

  • исключение yii web ServerErrorHttpException: код состояния 500.

  • yii web Слишком много запросов Исключение HttpException: код состояния 429.

  • исключение yii web UnauthorizedHttpException: код состояния 401.

  • Исключение yiiwebUnsupportedMediaTypeHttpException: код состояния 415.

Если исключение, которое вы хотите создать, отсутствует в приведенном выше списке, вы можете создать исключение HttpException yii web и создать его с кодом состояния следующим образом:

throw new \yii\web\HttpException(402);

Веб-ответ Yii:: заголовками можно управлять в компоненте ответа для отправки информации заголовка HTTP, например:

$headers = Yii::$app->response->headers;

// By adding a Pragma header, the existing Pragma header will not be covered.
$headers->add('Pragma', 'no-cache');

// Set up a Pragma header. Any existing Pragma header will be discarded
$headers->set('Pragma', 'no-cache');

// Delete the Pragma header and return the value of the deleted Pragma header to the array
$values = $headers->remove('Pragma');
  • Плюс: Имена заголовков чувствительны к регистру, и вновь зарегистрированная информация о заголовке не будет отправлена пользователю до вызова метода yiiwebResponse:: send ().

Большинство ответов должны содержать текст для хранения содержимого, которое вы хотите отобразить конечному пользователю.

Если отформатированная строка текста уже существует, ее можно назначить атрибуту веб-ответа yii:: содержимое ответа, например:

Yii::$app->response->content = 'hello world!';

Если вам нужно отформатировать его перед отправкой конечному пользователю, вы должны установить атрибуты yii web Response:: формат и yii web Response:: данные.

Атрибут веб-ответа yii:: формат определяет форматированный стиль данных в веб-ответе yii:: данные, такие как:

$response = Yii::$app->response; 
$response->format = \yii\web\Response::FORMAT_JSON; 
$response->data = ['message' => 'helloworld'];

Yii поддерживает следующие непосредственно доступные форматы, каждый из которых реализует класс yiiwebResponseFormatterInterface. Вы можете настроить эти форматеры или добавить форматеры, настроив атрибут yii web Response:: форматеры.

  • Веб-ответ Yii:: ФОРМАТ_HTML: Через форматер веб-Ответа yii В Формате Html.

  • Веб-ответ Yii:: FORMAT_XML: С помощью yii web XmlResponseFormatter.

  • Веб-ответ Yii:: FORMAT_JSON: Через yii web JsonResponseFormatter.

  • Веб-ответ Yii:: FORMAT_JSONP: Через веб-JsonResponseFormatter yii.

Приведенное выше тело ответа может быть задано явно, но в большинстве случаев оно неявно задается возвращаемым значением метода операции. Распространенные сценарии заключаются в следующем:

public function actionIndex(){ 
    return $this->render('index'); 
}

Операция индексирования, описанная выше, возвращает результат визуализации представления индекса, а возвращаемое значение форматируется компонентом ответа и отправляется конечному пользователю.

Поскольку формат ответа по умолчанию равен yii web Response:: FORMAT_HTML, вам нужно только вернуть строку в методе операции. Если вы хотите использовать другие форматы ответов, вам следует задать формат перед возвращением данных, например:

public function actionInfo(){ 
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
    return [ 
        'message' => 'hello world', 'code' => 100, 
    ]; 
}

Как упоминалось выше, lightning stroke также может создать свой собственный объект ответа и отправить его конечному пользователю с помощью компонента приложения ответа по умолчанию. Объект ответа может быть возвращен в методе операции следующим образом:

public function actionInfo(){ 
    return \Yii::createObject([ 
        'class' => 'yii\web\Response', 
        'format' => \yii\web\Response::FORMAT_JSON, 
        'data' => [ 'message' => 'hello world', 'code' => 100, ], 
    ]); 
}
  • Примечание. Если вы создадите свой собственный объект ответа, вы не сможете настроить компонент ответа в конфигурации приложения. Тем не менее, вы можете настроить свой новый объект ответа в общем виде с помощью приложения внедрения зависимостей.

Переходы браузера зависят от отправки HTTP-заголовка местоположения, поскольку эта функция часто используется, и Yii предоставляет для нее специальную поддержку.

Метод yii web Response:: redirect () может быть вызван для перехода браузера пользователя на URL-адрес.

Этот метод устанавливает соответствующий заголовок местоположения с указанным URL-адресом и возвращает его в качестве объекта ответа. В способе работы может быть вызвана аббревиатура yii web Controller:: redirect (), например:

public function actionOld(){ 
    return $this->redirect('http://example.com/new', 301); 
}

В приведенном выше коде метод операции возвращает результат метода redirect (). Как упоминалось ранее, объект ответа, возвращаемый методом операции, отправляется конечному пользователю в качестве общего ответа.

В дополнение к методу операции вы можете напрямую вызвать yii web Response:: redirect (), а затем вызвать метод yii web Response:: send (), чтобы убедиться, что к ответу больше ничего не добавляется.

\Yii::$app->response->redirect('http://example.com/new', 301)->send();
  • Дополнение: Метод yiiwebResponse:: redirect () по умолчанию использует код состояния ответа 302, который сообщает браузеру, что запрошенный ресурс временно размещен на другом адресе URI и что код состояния 301 может быть передан, чтобы сообщить браузеру, что запрошенный ресурс был постоянно перенаправлен на новый адрес URId.

Если текущий запрос является запросом AJAX, отправка заголовка местоположения не приведет к автоматическому переходу браузера. Чтобы решить эту проблему, метод yii web Response:: redirect () задает заголовок X-перенаправления, значением которого является URL-адрес для перехода. На стороне клиента можно написать код JavaScript для считывания значения заголовка, а затем позволить браузеру перейти по соответствующему URL-адресу.

  • Дополнение: Vii оснащен yii.js Файл JavaScript для обеспечения общих функций JavaScript, включая переходы в браузере на основе заголовков X-перенаправления, поэтому, если вы используете файл JavaScript (зарегистрированный через пакет ресурсов yiiwebYiiAsset), вам не нужно писать код перехода AJAX.

Аналогично переходам в браузере, отправка файлов-это еще одна функция, которая зависит от указания заголовков HTTP. Yii предоставляет набор методов для поддержки различных требований к отправке файлов, которые имеют встроенную поддержку HTTP-заголовков.

  • Веб-ответ Yii:: sendFile (): Отправить существующий файл клиенту

  • Веб-ответ Yii:: sendContentAsFile (): Отправьте клиенту текстовую строку в виде файла

  • Веб-ответ Yii:: sendStreamAsFile (): Отправьте существующий поток файлов клиенту в виде файла

Эти методы используют объект response в качестве возвращаемого значения. Если отправляемый файл очень большой, вам следует рассмотреть возможность использования веб-ответа yii:: sendStreamAsFile (), поскольку это экономит больше памяти. В следующих примерах показано, как отправить файл в процессе работы контроллера:

public function actionDownload(){ 
    return \Yii::$app->response->sendFile('path/to/file.txt'); 
}

Если метод отправки файла не вызывается в методе операции, веб-ответ yii:: отправить () должен быть вызван позже без добавления дополнительного содержимого к ответу.

\Yii::$app->response->sendFile('path/to/file.txt')->send();

Некоторые браузеры предоставляют специальную функцию отправки файлов, называемую X-Sendfile. Принцип заключается в том, чтобы перенаправлять запросы на файлы на сервере. Веб-приложения могут завершиться до того, как сервер отправит файлы. Чтобы использовать эту функцию, можно вызвать веб-ответ yii:: xSendFile (). Вот краткий список того, как некоторые распространенные веб-серверы включают функции X-Sendfile. Мочь:

  • Apache: X-Файл отправки

  • Lighttpd v1.4: X-LIGHTTPD-отправить файл

  • Lighttpd v1.5: X-Файл отправки

  • Nginx: X-Ускорение-Перенаправление

  • Чероки: X-Отправка файла и X-Ускорение-Перенаправление

Содержимое в ответе перед вызовом метода send () не отправляется пользователю. По умолчанию этот метод автоматически вызывается в конце базового приложения yii:: run (). Тем не менее, его можно явно призвать к немедленному реагированию.

Метод yii web Response:: send () использует следующие шаги для отправки ответа:

  1. Вызовите веб-ответ yii:: Событие EVENT_BEFORE_SEND.

  2. Вызовите веб-ответ yii:: подготовьте () для форматирования веб-ответа yii:: данные как веб-ответ yii:: содержимое.

  3. Вызовите веб-ответ yii:: Событие EVENT_AFTER_PREPARE.

  4. Вызовите веб-ответ yii:: отправить заголовки () для отправки зарегистрированных HTTP-заголовков

  5. Вызовите веб-ответ yii:: отправить содержимое (), чтобы отправить содержимое тела ответа

  6. Вызовите веб-ответ yii:: Событие EVENT_AFTER_SEND.

После выполнения метода yii web Response:: send () вызовы метода в другом месте игнорируются, что означает, что после отправки ответа дополнительное содержимое не может быть добавлено.

Как вы можете видеть, yii web Response:: send () запускает несколько практических событий, которые могут быть скорректированы или обернуты в ответ на эти события.