Tipo de solicitud HTTP
El protocolo HTTP define muchos tipos de solicitudes, incluidas OPTIONS, HEAD, GET, POST, PUT, DELETE, TRACE y CONNECT. Los detalles son los siguientes:
-
OPCIONES: Devuelve el método de solicitud HTTP admitido por el servidor para un recurso específico. También puede probar la función del servidor enviando una solicitud de '*' al servidor web.
-
HEAD: Solicite al servidor una respuesta coherente con la solicitud GET, pero no se devolverá el cuerpo de la respuesta. Este método puede obtener metainformación no incluida en el encabezado de la respuesta sin tener que transmitir todo el contenido de la respuesta.
-
OBTENER: realiza una solicitud a un recurso específico.
-
POST: envíe datos a un recurso específico para procesar la solicitud (como enviar un formulario o cargar un archivo). Los datos están contenidos en el cuerpo de la solicitud. Las solicitudes POST pueden resultar en la creación de nuevos recursos y / o la modificación de recursos existentes.
-
PUT: sube su contenido más reciente a la ubicación del recurso especificado.
-
DELETE: solicita al servidor que elimine el recurso indicado
-
TRACE: repite la solicitud recibida por el servidor, utilizada principalmente para pruebas o diagnósticos.
-
CONNECT: El protocolo HTTP / 1.1 está reservado para servidores proxy que pueden cambiar la conexión al modo pipe.
Lo que usamos comúnmente en aplicaciones prácticas es get y post, y otros métodos de solicitud también se pueden implementar indirectamente a través de get y post.
La diferencia entre las solicitudes GET y POST
-
Los datos enviados por GET se colocan en la URL del mensaje de solicitud HTTP. Separe la URL y los datos de transferencia, y conecte los parámetros con &, como / Response / get? Key1 = value1 & key2 = value2. POST coloca los datos enviados en el cuerpo del mensaje de solicitud HTTP.
-
El tamaño de los datos enviados por GET es limitado, mientras que los datos enviados por el método POST no están limitados.
-
GET necesita usar _GET ["key"], y POST se implementa usando _POST ["key"], leyendo php: // input stream o leyendo la constante HTTP_RAW_POST_DATA
Estructura del mensaje de solicitud HTTP
La estructura de solicitud HTTP se muestra en la siguiente figura
-
La línea de solicitud incluye el tipo de solicitud HTTP (GET, POST, etc.), la URL de la solicitud y el número de versión de Http.
Cuando se usa el método "GET", el cuerpo está vacío -
El encabezado de solicitud HTTP contiene parámetros de operación de solicitud HTTP. El atributo de encabezado define varias características de los datos transmitidos.
-
El cuerpo de la solicitud HTTP contiene otra información que se incluye en la solicitud.
Encabezado de solicitud HTTP
El encabezado de solicitud HTTP contiene lo siguiente:
-
Encabezado de caché
-
Encabezado del cliente
-
Campo de encabezado de cookie / inicio de sesión
-
Campo de encabezado de entidad
-
Varios 头 域
-
Cabecera de transporte
Encabezado de caché
Si-modificado-desde
Función: envíe la hora de la última modificación de la página almacenada en caché del lado del navegador al servidor, y el servidor comparará esta hora con la hora de la última modificación del archivo real en el servidor. Si la hora es la misma, devuelva 304 y el cliente utiliza directamente el archivo de caché local. Si el tiempo es inconsistente, devolverá 200 y el nuevo contenido del archivo. Una vez que el cliente lo recibe, descarta el archivo antiguo, almacena en caché el nuevo archivo y lo muestra en el navegador.
Por ejemplo: If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT
Si-no-coincide
Función: If-None-Match y ETag funcionan juntos, el principio de funcionamiento es agregar información ETag en la respuesta HTTP. Cuando el usuario solicita el recurso nuevamente, la información If-None-Match (valor ETag) se agregará a la solicitud HTTP. Si el servidor verifica que la ETag del recurso no ha cambiado (el recurso no se ha actualizado), devolverá un estado 304 para indicarle al cliente que use el archivo de caché local. De lo contrario, devolverá el estado 200 y el nuevo recurso y Etag. El uso de este mecanismo mejorará el rendimiento del sitio web.
Por ejemplo: If-None-Match: "03f2b33c0bfcc1: 0"
Pragma
Función: Evita que las páginas se almacenen en caché. En la versión HTTP / 1.1, tiene exactamente la misma función que Cache-Control: no-cache.
Solo hay un uso de Pargma, por ejemplo: Pragma: no-cache
Nota: En HTTP / Versión 1.0, solo se implementa Pragma: sin caché, el control de caché no está implementado
Control de caché
Rol: esta es una regla muy importante. Esto se utiliza para especificar el mecanismo de almacenamiento en caché seguido de Response-Request. Los significados de los comandos de uso común son los siguientes:
Control de caché: cualquier caché puede almacenar en caché público
Control de caché: el contenido privado solo se almacena en caché en el caché privado
Control de caché: sin caché Todo el contenido no se almacenará en caché
Encabezado del cliente
Aceptar
Función: El tipo de medio que el navegador puede aceptar, por ejemplo: Aceptar: texto / html significa que el navegador puede aceptar el tipo devuelto por el servidor como texto / html, que es lo que a menudo llamamos documentos html. Si el servidor no puede return text / html types Data, el servidor debe devolver un error 406 (no aceptable).
El comodín * representa cualquier tipo
Por ejemplo, Aceptar: / representa que el navegador puede manejar todos los tipos (generalmente, el navegador envía esto al servidor)
Aceptar codificación
Función: El navegador declara el método de codificación que recibe, generalmente especificando el método de compresión, si admite compresión y qué método de compresión admite (gzip, deflate) (nota: esto no es solo una codificación de caracteres);
Por ejemplo: Accept-Encoding: gzip, deflate
Aceptar-idioma
Función: el navegador declara el idioma que recibe. La diferencia entre idioma y juego de caracteres: el chino es un idioma y el chino tiene múltiples juegos de caracteres, como big5, gb2312, gbk, etc .;
Por ejemplo: Accept-Language: en-us
Agente de usuario
Función: Informar al servidor HTTP, el nombre y la versión del sistema operativo y el navegador que utiliza el cliente.
Cuando iniciamos sesión en foros en línea, a menudo vemos algunos mensajes de bienvenida, que enumeran el nombre y la versión de su sistema operativo, y el nombre y la versión del navegador que está utilizando. Esto a menudo hace que muchas personas se sientan increíbles. De hecho, el servidor La aplicación obtiene esta información del campo de encabezado de solicitud de Usuario-Agente. El campo de encabezado de solicitud de Usuario-Agente permite al cliente decirle al servidor su sistema operativo, navegador y otros atributos.
例如 : Agente de usuario: Mozilla / 4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident / 4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C ; InfoPath.2; .NET4.0E)
Aceptar-Charset
Función: el navegador declara el conjunto de caracteres que recibe. Estos son los diversos conjuntos de caracteres y codificaciones de caracteres introducidos anteriormente en este artículo, como gb2312, utf-8 (normalmente decimos que Charset incluye el esquema de codificación de caracteres correspondiente)
Campo de encabezado de cookie / inicio de sesión
Galleta
Función: el encabezado más importante, que envía el valor de la cookie al servidor HTTP
Campo de encabezado de entidad
Largancia de contenido
Rol: la longitud de los datos enviados al servidor HTTP.
Por ejemplo: Content-Length: 18
Tipo de contenido
Rol: el tipo de datos enviados al servidor HTTP
例如 : Tipo de contenido: application / x-www-form-urlencoded
Varios 头 域
Referer
Función: El servidor que proporciona la información de contexto de la Solicitud le dice al servidor de qué enlace vengo. Por ejemplo, si me enlace a un amigo desde mi página de inicio, su servidor puede contar desde el Referente HTTP cuántos usuarios hacen clic en mi página de inicio cada día Visite su sitio web en el enlace.
例如: Referer: http://translate.google.cn/?hl=zh-cn&tab=wT
Cabecera de transporte
Conexión
Por ejemplo: Conexión: Keep-Alive Cuando se abre una página web, la conexión TCP utilizada para transmitir datos HTTP entre el cliente y el servidor no se cerrará. Si el cliente vuelve a acceder a la página web en el servidor, continuará utilizar el establecido. Conexión
Por ejemplo: Conexión: cerrada significa que después de que se completa una solicitud, la conexión TCP utilizada para transmitir datos HTTP entre el cliente y el servidor se cerrará. Cuando el cliente envía la solicitud nuevamente, la conexión TCP debe restablecerse.
Host (este encabezado es necesario al enviar una solicitud)
Función: El campo del encabezado de la solicitud se usa principalmente para especificar el host de Internet y el número de puerto del recurso solicitado. Suele extraerse de la URL HTTP.
Por ejemplo: Ingresamos en el navegador: http://www.baidu.com , el navegador envía En el mensaje de solicitud, contendrá el dominio del encabezado de solicitud del Host, como se indica a continuación:
Host: http://www.baidu.com
Aquí se utiliza el número de puerto predeterminado 80, si se especifica el número de puerto, se convierte en: Host: el número de puerto especificado
Encabezado de solicitud de procesamiento de PHP
En PHP, si desea obtener todos los encabezados de solicitud HTTP, puede usar el método getallheaders , pero este método no existe en ningún entorno. Por ejemplo, si usa fastcgi para ejecutar PHP, no existe tal método, por lo que todavía Necesitamos considerar otros métodos. Afortunadamente, $ _SERVER tiene lo que queremos. El nombre de la clave que comienza con HTTP_ es el encabezado de la solicitud HTTP:
$ encabezados = matriz (); foreach ($ _SERVER como $ clave => $ valor) { if ('HTTP_' == substr ($ clave, 0, 5)) { $ encabezados [str_replace ('_', '-', substr ($ clave, 5 ))] = $ valor; echo "$ clave: $ valor \ n"; } } 1234567
Cabe señalar que la RFC establece claramente que el nombre del encabezado del mensaje no distingue entre mayúsculas y minúsculas.
Pero no todos los encabezados de solicitud HTTP existen en $ _SERVER en forma de claves que comienzan con HTTP_. Por ejemplo, Authorization, Content-Length, Content-Type no son así, por lo que para obtener todos los encabezados de solicitud HTTP, también es necesario agregar el siguiente código:
// 获取 encabezado AUTORIZACIÓN if (isset ($ _ SERVER ['PHP_AUTH_DIGEST'])) {$ encabezado ['AUTORIZACIÓN'] = $ _SERVER ['PHP_AUTH_DIGEST']; $ valor = $ _SERVER ['PHP_AUTH_DIGEST']; echo "AUTORIZACIÓN: $ valor \ n"; } elseif (isset ($ _ SERVER ['PHP_AUTH_USER']) && isset ($ _ SERVER ['PHP_AUTH_PW'])) {$ encabezado ['AUTORIZACIÓN'] = base64_encode ($ _ SERVER ['PHP_AUTH_USER']. ':'. $ _SERVER ['PHP_AUTH_PW']); $ valor = código_base64 ($ _ SERVER ['PHP_AUTH_USER']. ':'. $ _SERVER ['PHP_AUTH_PW']); echo "AUTORIZACIÓN: $ valor \ n"; ] = $ _SERVER ['CONTENT_LENGTH']; $ valor = $ _SERVER ['CONTENT_LENGTH']; echo "CONTENIDO-LONGITUD: $ valor \ n"; } // 获取 Encabezado CONTENT-LENGTH if (isset ($ _ SERVER ['CONTENT_LENGTH'])) {$ encabezado ['CONTENT-LENGTH'] = $ _SERVER ['CONTENT_LENGTH']; $ valor = $ _SERVER ['CONTENT_LENGTH']; echo "CONTENIDO-LONGITUD: $ valor \ n"; } // 获取 encabezado CONTENT-TYPE if (isset ($ _ SERVER ['CONTENT_TYPE'])) {$ encabezado ['CONTENT-TYPE'] = $ _SERVER ['CONTENT_TYPE']; $ valor = $ _SERVER ['CONTENT_TYPE']; echo "TIPO DE CONTENIDO: $ valor \ n"; } 12345678910111213141516171819202122
PHP maneja los parámetros de solicitud GET
<? php public function request_get () { echo $ _GET ["nombre"]; echo '<br/>'; echo $ _GET ["edad"]; echo '<br/>'; }?> 12345678
Solicitud de ejemplo: http: // host_name / path? Name = Peter & age = 37
Salida PHP: Peter 37123
PHP maneja el cuerpo de la solicitud POST
PHP tiene tres formas de procesar el cuerpo de la solicitud HTTP POST
-
Utilice _POST ["clave"] variables predefinidas
-
Utilice la constante HTTP_RAW_POST_DATA
-
Leer php: // flujo de entrada
_POST [“clave”]
_POST ["key"] puede obtener el contenido correspondiente a la clave por el valor de la clave, pero solo puede procesar los datos enviados por Content-Type: application / x-www-form-urlencoded
<? php public function request_post () { echo $ _POST ["nombre"]; echo '<br/>'; echo $ _POST ["edad"]; echo '<br/>'; }?> 12345678
请求 示例 POST http: // nombre_host / ruta HTTP / 1.1Host: nombre_host Longitud del contenido: 18 Tipo de contenido: application / x-www-form-urlencodedname = Peter age = 3712345678
Salida PHP: Peter 37123
HTTP_RAW_POST_DATA
La constante HTTP_RAW_POST_DATA no está disponible para los datos del formulario enctype = ”multipart / form-data”, lo que significa que el formulario no está disponible al enviar datos de flujo binario.
HTTP_RAW_POST_DATA y _POST son básicamente lo mismo, pero si los datos de la publicación no son PHP o algo más, puede usar GLOBALS ['HTTP_RAW_POST_DATA'] para recibirlos, como soap / xml.
Por lo tanto, si PHP usa HTTP_RAW_POST_DATA para procesar los datos de la publicación, debe agregar el encabezado Content-Type al mensaje de solicitud al enviar la solicitud. Para el texto, agregue Content-Type = text / xml
Además, PHP5.6 ha abandonado la constante HTTP_RAW_POST_DATA, y se recomienda usar php: // input para procesar datos POST en versiones posteriores a 5.6.
<? php public function request_post () { echo urldecode ($ GLOBALS ['HTTP_RAW_POST_DATA']); }?> 12345
请求 示例 POST http: // nombre_host / ruta HTTP / 1.1Host: nombre_host Longitud del contenido: 18 Tipo de contenido: texto / xmlname = Peter age = 3712345678
Salida PHP: nombre = Peterage = 37123
php: // entrada
php: // input es un flujo de solo lectura que puede acceder a los datos sin procesar de la solicitud, pero tampoco está disponible para los datos del formulario enctype = ”multipart / form-data” (igual que $ HTTP_RAW_POST_DATA).
Si PHP usa php: // input para procesar datos de publicación, no es necesario agregar un encabezado Content-Type en el mensaje de solicitud
<? php public function request_post () { echo file_get_contents ('php: // input'); }?> 12345
请求 示例 POST http: // nombre_host / ruta HTTP / 1.1Host: nombre_host Longitud del contenido: 18name = Peter age = 371234567
Salida PHP: nombre = Peterage = 37123
A través del estudio de la serie de artículos sobre el protocolo HTTP detallados por Xiaotan, publicados en el jardín del blog , combinados con los documentos oficiales de PHP, resumí este texto sobre el protocolo HTTP. En el camino a seguir, se necesita la sabiduría de los predecesores para indicar la dirección, ¡gracias aquí!