Utilice PHP para procesar mensajes de solicitud HTTP

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 
Escriba la descripción de la imagen aquí

  • 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í!

Supongo que te gusta

Origin blog.csdn.net/keke795/article/details/112975979
Recomendado
Clasificación