application / x-www-form-urlencoded y JSON análisis distinción bien multipart / form-data y aplicación /

1. debida

  Internet no puede encontrar la aplicación / x-www-form-urlencoded y multipart / form-data y la aplicación / JSON explica por completo la diferencia entre los tres artículos, estoy muy decepcionado, idiopática este post explicación detallada.

  Cuando el extremo delantero de la transferencia de datos a la parte posterior, las necesidades a ser codificada, en el que el formato de codificación se puede dividir en cuatro categorías: urlencoded-x-www-formulario de solicitud /, multipart / form-data, application / json, text / plain.

  texto / datos de texto plano sin formato, ninguna explicación aquí, por lo general no se utilizarán.

  Taiwán antes y después de la finalización del intercambio de datos son sólo dos maneras: En primer lugar, la forma de envío del formulario, y en segundo lugar, presentar ajax.

  atributo forma forma enctype puede ser proporcionado por un tipo de codificación, el valor predeterminado: application / x-www-form-urlencoded; ajax tipo de codificación puede ser conjunto, los valores predeterminados son propiedad contentType: application / x-www-form-urlencoded;

2.Application / x-www-form-urlencoded

  Cómo utilizar el request.getParameter recepción detrás del escenario ( "trabajo") ;? Para obtener el nombre del parámetro y el valor.

  Este formato de codificación es la forma más común de uno, los datos se encapsulan en una cadena, el nombre del parámetro y el parámetro de valor utilizando el "=" de empalme, utilizando el "&" entre el empalme parámetro entrega final a los datos de fondo tiene la forma : clave1 = valor1 y valor2 y clave2 = ...;

  Además, clave y valor son, respectivamente, usando el encodeURI () ser codificada, es decir, los datos que desea pasar, de hecho, ha sido una codificación de la forma: nombre = Marydon y trabajo =% E7% A8% 8B% E5% BA% 8F% E5% 91% 98, después de que el servidor recibe la primera cosa es utilizar un URLDdecoder.decode seco () el nombre y valor de la una vez decodificada.

  Sea o formulario de solicitud de formulario de solicitud de ajax, de modo que los datos se ensamblan.

  La diferencia básica entre las peticiones de solicitud de entrada se obtiene:

  Se trata de una petición GET

  La figura es una solicitud POST

  La diferencia es: obtener solicitudes directamente empalmado datos del formulario a la dirección URL con? Además, los datos externos visibles; la solicitud POST en un cuerpo de solicitud de datos no quiere ver directamente los datos a transmitir, la seguridad es relativamente mayor.

  PD: se quiere comparar la diferencia de dos solicitudes en el navegador Internet Explorer para depurar el más intuitivo, cromo no.

  Esta es la diferencia entre los dos bien conocida por nuestro público, entonces la pregunta es, ¿Por qué hacer peticiones presentado datos al realizar blanco chino chinos de datos recibidos ser un poco incómodo, pero la solicitud no será ilegible post it?

  Luego, busquen en estas dos solicitudes:  

  obtener solicitud

  solicitud POST

  Los personajes petición de fondo impreso

// conjunto de caracteres es la solicitud 
System.out.println (request.getCharacterEncoding ());  

  Antes y después de los extremos de la prueba, esta vez podemos ver la diferencia entre get post para solicitar otra petición:

  Cuando es application / x-www-form-urlencoded (por defecto es decir), el navegador envía una petición de vuelta a la forma en la forma de datos que codifican tipo se proporciona, se divide en dos casos:

  Cuando la solicitud de la get modo, ninguna solicitud cabecera Content-Type información de atributos, no hay un conjunto de designación de caracteres de datos;

  Cuando la solicitud es un modo POST, hay un tipo de contenido de información de atributos de encabezado de solicitud, y para especificar el conjunto de caracteres de los datos, a saber: application / x-www-form-urlencoded; charset = UTF-8;

  Al llegar una solicitud, el conjunto de caracteres utilizado en el final lo que es? El resultado de las pruebas de fondo: ISO-8859-1

// obtener el carácter conjunto predeterminado de solicitud de 
tubería de trabajo = new String (work.getBytes ( "iso-8859-1"), "UTF-8");

  Así las cosas, en la solicitud de ajax, no podemos declarar explícitamente solicitud atributo contentType para resolver el problema de la basura conseguirlo?

escribir: 'conseguir', // método de petición 
contentType: 'application / x-www -forma-urlencoded; charset = UTF-8', // explícitamente declare

  Página en vigor

  Los resultados han sido decepcionantes:

  O distorsión, tuvo que volver a codificar. 

  Content-Type atributo indica los datos presentados conjunto de caracteres del servidor es UTF-8, y permitir que el servidor de datos en formato UTF-8 de análisis, podemos ver:

  El problema no es el servidor, y en el que el navegador: cuando los detecta navegador que el formato de codificación es application / x-www-form-urlencoded y es una solicitud GET, el navegador codifica primero el formulario de datos con la norma ISO-8859-1, y entonces encodeURI () codificada.

  Por lo tanto, obtener los antecedentes que llevaron a la petición recibida Chino ilegible la causa fundamental: la página es juego de caracteres UTF-8, pero el navegador de acuerdo a recodificar iso-8859-1, entre bastidores después de recibir la orden de UTF-8 decodificación curso se ilegible.

  resumen:

  Cuando el formato de codificación de los datos del formulario: cuando la aplicación / x-www-form-urlencoded:

  obtener solicitud, el navegador va a ser re-codificado de datos según la norma ISO-8859-1, inevitablemente resulta en un fondo recibidas ilegibles china;

  solicitud posterior, el navegador va a enviar los datos a ser codificado como UTF-8, ya que el fondo en sí es utilizar UTF-8 lo analiza, por lo que no aparecerá situación ilegible.

  Como obtener una petición para resolver el problema de la basura Hay dos formas principales, veo otro artículo.

3.multipart / form-data

  Se utiliza principalmente para la transferencia de archivo, el archivo convierte en datos binarios para la transmisión no implica problemas de transcodificación.

  Cómo utilizar el request.getInputStream recepción detrás del escenario () ;? Valor.

  IE y el navegador de cromo, forma de transmisión de datos no es la misma;

  navegador IE

  navegador Chrome 

  Común es: Content-Type valor multipart / form-data; boundary = --..., aparentemente ningún otro formato fijo, ya no se considera, siempre y cuando el fondo de la línea recibida.

  Antecedentes de los datos recibidos, como este:

  Encuadernación implementación del código: 

  Los datos de transmisión de extremo delantero

<input type = "file" id = "archivo" onchange = "carga ( 'getParams')" style = "display: none;"> 
<input type = valor "botón" = "上传" onclick = "javascript: $ ( "#file"). click () '>  
función de carga (URL) { 
    // Obtener JS objeto de archivo 
    var fileObj = document.getElementById ( "Archivo") Archivos [0] ;. 
    SI (fileObj == null) { 
        alert ( "carga de imágenes. Por favor, intente de nuevo!") ; 
        return; 
    } 
    // crear un formulario forma 
    var FormFile los nuevos FormData nuevos = (); 
    // Añadir objeto de archivo 
    formFile.append ( "archivo", fileObj); 
    // Crear un objeto XMLHttpRequest 
    XHR var = new new XMLHttpRequest (); 
    modo POST // , url solicitudes de la dirección del servidor, verdaderos este parámetro especifica si la solicitud es el procesamiento asincrónico. 
    xhr.open ( "POST", URL, a true); 
    // solicitud se completa 
    xhr.onload = function () { 
        // devuelve los datos en una JSON objeto 
        var = resDatos la JSON.parse (this.responseText); 
        document.getElementById ( "archivo"). 
    }; 
    // Error de la solicitud 
    Xhr.onerror = null; 
    // llamar al progreso método de carga (barra de progreso puede ser implementado de subida) 
    xhr.upload.onprogress = null; 
    // // iniciar la carga, la forma de transmisión de datos (datos binarios para pasar a un segundo plano) 
    xhr.send (FormFile); 
}

  antecedentes de recepción

protected void doGet (HttpServletRequest solicitud, HttpServletResponse respuesta) lanza ServletException, IOException { 
    InputStream es = request.getInputStream (); 
    int i = 0; 
    while ((i = is.read ()) = -1) { 
        System.out.print ((char) i); 
    } 
}

4.Application / JSON

  Cómo backstage recepción? Uso request.getReader () valor también se puede utilizar request.getInputStream () Obtiene.

  Ejemplos de errores:

.ajax $ ({ 
	tipo: 'post', // solicitud de modo de 
	url: 'getParams', // petición de dirección 
	contentType: 'archivo application / JSON; charset = UTF-8.', 
	de datos: { 'nombre': 'Marydon', 'trabajo': 'programador'}, 
	el éxito: function (Resultado) {// petición tiene éxito 
		Alerta (result.work); 
	} 
});

  Los resultados forman los datos se presentó en forma de una forma, no es JSON

  Las transmisiones de datos en formato JSON, enviado desde el extremo frontal en forma de manera inusual JSON, es común al servidor, los datos transmitidos es decir, un servidor JSON desde el servidor, otro servidor recibe de él.

  Más cerca de casa, la forma de pasar datos a la transferencia de fondo ajax JSON que?

  En primer lugar, hay que entender es que el extremo frontal de la transmisión de datos back-end y sólo hay dos maneras, una es el formato de cadena común, mientras que otro es datos binarios, es decir, no importa qué tipo de datos se trasladarán a su fondo se convierte en caracteres cadena o binario.

  De esta manera, entendemos, a las transferencias de fondo, que no pasa un objeto JSON, pero hay que pasar una cadena JSON.

  Y la diferencia entre la llamada Ajax ordinario, sólo que: nombre del parámetro, que nombre tiene comillas simples, {} en ambos lados para estar entre comillas, por lo que no es necesario utilizar la barra invertida \ para escapar de ella.

  la implementación del código

.ajax $ ({ 
	tipo: 'post', // solicitud de modo de 
	url: 'getParams', // petición de dirección 
	contentType: 'application / json; charset = UTF-8', // indica al servidor, la transferencia de datos es JSON ( puede omitirse) 
	de datos: "{ 'nombre': 'Marydon', 'trabajo': 'programador'}", // cadena JSON (requisito) 
	el éxito: function (resultado) {// petición tiene éxito 
		alerta (resultado. de trabajo); 
	} 
});  

  Antecedentes de recepción: Hay dos maneras

  Método 1: Utilice un valor de flujo de caracteres -request.getReader ()

StringBuffer buffer = nuevo StringBuffer (); 
Lector BufferedReader = request.getReader (); 
String s = ""; 
while ((s = reader.readLine ())! = null) { 
    buffer.append (s); 
} 
System.out.println (JSONObject.fromObject (buffer.toString ())); 
System.out.println (buffer.toString ());  

  Segunda manera: un -request.getInputStream valor de flujo de bytes ()

int i = 0; 
StringBuffer buffer = nuevo StringBuffer (); 
InputStream corriente = request.getInputStream (); 
while ((i = stream.read ()) = -1) { 
    buffer.append ((char) i); 
} 
System.out.println (JSONObject.fromObject (buffer.toString ())); 
System.out.println (buffer.toString ());

  resultados de impresión

  Después de la prueba encontró que incluso Ajax no declara contentType, que es el valor por defecto utilizado: urlencoded-x-www-formulario de solicitud /, cuando en realidad se está transmitido cadena JSON, el fondo todavía se puede recibir normalmente. Como se muestra a continuación:

  Aunque el fondo normalmente puede recibir, sin embargo, con el fin de estandarizar acto o declaración sobre el mismo. 

  Además, como se puede ver cuando se desea transferir la cadena de fondo JSON, se le cometer los mismos problemas petición GET: chino Cuando el valor del parámetro, será ilegible los antecedentes recibidos, la transcodificación de forma manual.

  Hay dos maneras de resolver la basura, no repetirlos aquí, otros artículos tienen una explicación detallada. 

  

Escrito en los últimos

  ¿Qué hermano mayor Si se comprueba que hay fuga de la falta de cuidado del artículo o necesidad de añadir más contenido, mensaje de bienvenida! ! !

 Recomendación relacionada:

 

Supongo que te gusta

Origin www.cnblogs.com/Marydon20170307/p/12621036.html
Recomendado
Clasificación