Статьи

ОТДЫХ — Можете ли вы сделать больше, чем просто записать? Часть 4

В предыдущих частях этой серии вы узнали, что такое REST , как разработать приложение RESTful и как использовать сервисы RESTful. Сейчас мы приближаемся к концу, и остается только немного подробнее рассказать о протоколе, который вы, скорее всего, будете использовать в любом приложении RESTful, которое вы пишете. Поскольку HTTP так часто используется с REST, на этом протоколе я бы хотел остановиться.

Основы HTTP-заголовка

В общем смысле, я обычно представляю одну сущность, когда слышу слово «заголовок», обычно около 780 символов в длину и в него встроено около 50 параметров, где, если вы их облажаете, то все не работает. Я также думаю о заголовке как о чем-то, что установлено и запрещено стандартом. Стандарт определяет, какие значения отправляются с заголовком, и у вас нет большого контроля над значениями или форматированием. И, как правило, для каждой транзакции используется только один заголовок. Но HTTP-заголовки не совсем такие.

Формат заголовка

Во-первых, они, как правило, очень короткие.

Во-вторых, каждый HTTP-заголовок содержит только одну характеристику (именно поэтому они имеют тенденцию быть короткими).

В-третьих, у вас будет несколько строк заголовка, в зависимости от того, сколько информации вы хотите передать вместе с запросом.

В своей простейшей форме каждый заголовок состоит из двух основных компонентов: идентификатора или характеристики и значения, с двоеточием, разделяющим два, так что нет никакого шалфея. Там нет точки с запятой, чтобы закончить заголовок, но, как вы увидите в нескольких абзацах, если у вас есть более одного значения для идентификатора, то различные значения разделяются точкой с запятой.

Вот пара очень простых HTTP-заголовков, чтобы намочить ноги:

  Пользователь-агент: Safari 5.2 
 Принять: * / * 

Первый заголовок идентифицирует пользовательский агент (обычно веб-браузер), который делает запрос. Второе указывает, что когда данные возвращаются с сервера, пользовательский агент принимает все типы контента. В обоих случаях указывается конкретная характеристика, за которой следует двоеточие, а затем значение, которое вы хотите, чтобы оно было.

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

Но помните, как я сказал «в простейшем виде»? Это должно было быть очень четким предупреждением о том, что все может стать более сложным (или гибким), и это действительно так в большинстве случаев.

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

Если вы просто хотите американский английский, тогда заголовок Accept-Language

  Accept-Language: en-us 

Чтобы также принять британский английский и итальянский, вы используете более сложные обозначения, а именно:

  Accept-Language: en-us;  ан-ГБ, Q = 0,8;  он, д = 0,3 

Как я уже сказал, двоеточие отделяет характеристику от ее значения. Точка с запятой отделяет несколько значений друг от друга. Здесь q В приведенном выше примере вы запрашиваете американский английский. Но если этого нет, вы готовы принять британский английский или итальянский, но с большим предпочтением британского английского по сравнению с итальянским, если оба доступны.

Заголовок «Статус»

Всегда есть хотя бы один заголовок, который будет присутствовать в ответе, и это заголовок статуса. Но в отличие от формата заголовков, который я только что объяснил, заголовок статуса уникален.

Строка состояния состоит из трех частей информации; используемая версия HTTP; трехзначный код состояния запроса и краткое описание значения этого кода состояния. Например,

  HTTP / 1.1 200 ОК 

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

  • 1XX — информационный
  • 2XX — успех
  • 3XX — Перенаправление
  • 4XX — ошибка клиента
  • 5XX — Ошибка сервера

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

Общие заголовки

Вы можете использовать большое количество различных заголовков, большинство из которых имеет свой собственный характерный словоблудие. Для получения полного списка, что это такое, вы можете снова заглянуть в Википедию, которая разбивает их на заголовки запросов и заголовков ответов. Для получения более подробной информации, посмотрите на стандарт HTTP 1.1 . Вот некоторые из наиболее распространенных заголовков, перечисленных в книге « Мастер PHP: написание передового кода» :

  • Accept
  • Accept-Language
  • Accept-Encoding
  • Content-Type
  • Content-Encoding
  • Content-Language
  • Content-Length
  • Set-Cookie
  • Cookie
  • Expires
  • Authorization

Хотя вы, вероятно, никогда не будете использовать большинство заголовков, вы все равно должны ознакомиться со всем списком. Иногда знание — это собственная награда.

Заголовки с PHP

Так какое отношение все это имеет к PHP? Что ж, если вы планируете делать что-то стоящее с REST с использованием HTTP, вы, вероятно, захотите отправлять и получать заголовки. Во-первых, давайте начнем с исходящего ответа от PHP.

Заголовки ответа

Обязательно, чтобы заголовки были отправлены до фактического ответа. Причина в том, что заголовки — это просто текст, и нет никакой магии, которая бы различала заголовки и тело ответа, если бы они были смешаны. Это джентльменское соглашение, что заголовки будут отправлены первыми, и все, кроме существ с самыми черными сердцами, соблюдают это правило.

Чтобы отправить заголовок из PHP пользовательскому агенту, вы используете функцию header() Например:

 <?php
header("Content-Language: en-AU");

Это действительно так просто, приятель! Заголовок заключен в кавычки, потому что это строка и помещен в зону скобок функции. Да, и поскольку это оператор PHP, в конце есть точка с запятой.

Вы можете отправлять любые заголовки, которые вам нравятся, на все, что вы хотите сказать пользовательскому агенту, который возвращает ответ. Хотите установить дату / время, после которого ответ должен рассматриваться как устаревший? Используйте заголовок Expire Хотите, чтобы пользовательский агент интерпретировал ответ как изображение PNG? Отправьте заголовок Content-Type Вы можете отправлять любые и сколько угодно заголовков непосредственно перед отправкой перед телом ответа.

Заголовки запроса

Заголовки, которые вы отправляете с запросом, могут быть использованы для того, чтобы сообщить серверу больше о ресурсе, который вы ищете. Давайте рассмотрим следующий пример: у нас есть ресурс RESTful, example.com/user/42 Но хотите ли вы, чтобы информация возвращалась в виде XML-документа? Или, может быть, вы хотите просто изображение профиля человека, которого он представляет? Заголовок Accept

 <?php
$uri = "http://example.com/user/42";
$ch = curl_init();

// request XML representation of user
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: application/xml"));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_GET, true);
$xml = curl_exec ($ch); 

// request image representation of user
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Accept: image/jpg"));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_GET, true);
$jpg = curl_exec ($ch);

Преимущество, которое дают нам такие заголовки, заключается в том, что мы можем создать один ресурс, например example.com/user/42example.com/user/42.xmlexample.com/user/42.html Это хороший подход RESTful, который поддерживает чистоту URI и использует все преимущества используемого протокола.

Пользовательские заголовки HTTP

Как вы уже видели, уже задано много HTTP-заголовков. И вы думаете, что этого будет достаточно. Но нет, для некоторых людей никогда не бывает достаточного количества заголовков, и поэтому HTTP также позволяет вам определять свои собственные заголовки.

Какую вещь вы можете поместить в пользовательский заголовок? Это может быть что угодно. Возможно, вы хотите, чтобы местоположение сервера было возвращено клиенту. Честно говоря, выяснение того, чего вы хотите, но которого нет в стандартном заголовке, кажется скорее вашей проблемой, чем моей. Здесь уже почти полночь, и я думаю, что вам действительно нужно проявить инициативу здесь! :)

Однако следует помнить одну вещь: вам все равно нужно определить пользовательский заголовок в контексте, в котором вы работаете. То есть пользовательский заголовок в некотором смысле похож на локальную переменную и будет иметь только значение в определенном пространстве. И веб-сервер, и клиент должны согласовать его значение в отношении запроса.

Пользовательские заголовки кажутся немного спорными с некоторыми разработчиками, обеспокоенными их распространением, потому что для них нет реального стандарта. Некоторые люди предпочитают ставить перед словом «x-» префикс, а другие думают, что это не очень хорошая идея, если такой пользовательский заголовок когда-либо попадет в стандарт.

Так что пользовательские заголовки плохие, верно? Ну, не обязательно. Как выяснилось, некоторые крупные игроки, такие как Google и Oracle , определили набор своих собственных заголовков клиентов, которые можно использовать с их API REST. Так что, возможно, они не дьявол в конце концов.

Резюме

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

Видишь ли, я говорил тебе, что все получится к лучшему. Хотя теперь, когда я об этом думаю, я на самом деле никогда не говорил этого. И, судя по моей жизни, идея о том, что все идет к лучшему, кажется просто глупой. Но независимо от того, как вы это делаете, REST — это надежная альтернатива для большинства ваших потребностей в создании веб-приложений и того, что вы должны понять сами. Спасибо, что присоединились ко мне в этой серии из четырех частей, и я надеюсь, что теперь вы знаете больше о REST, чем просто как это пишется.

Изображение через littlesam / Shutterstock