Las URL están en todas partes, pero parece que los desarrolladores realmente no las entienden, porque a menudo veo personas que preguntan cómo crear una URL correctamente en el desbordamiento de la pila. Si desea saber cómo funciona la sintaxis de URL, puede leer este artículo de Lunatech, que es muy bueno.
Este artículo no presentará la sintaxis completa de las URL en profundidad (si desea comprender completamente las URL, puede leer RFC 3986, RFC 1738 y el artículo mencionado anteriormente, así como la documentación anterior W3). Aquí quiero hablar sobre algunas bibliotecas comunes en las URL operativas y cómo usarlo correctamente a través del constructor de URL. Esta es una biblioteca Java que publicamos para crear URL correctamente.
Pregunta 1: Urlencoder de Java
Esta clase no solo se llama mal, sino que su primera oración en el documento no es muy correcta.
Clase de utilidad para la codificación de formulario HTML.
Tal vez se pregunte por qué se llama URLEncoder, pero está completamente sin palabras cuando ve esta línea.
Si ha leído la publicación del blog de Lunatech, ahora debe comprender que no puede convertir milagrosamente una cadena de URL en un objeto URL seguro y codificado correctamente a través de esta clase. Por supuesto, si no ha hecho suficiente tarea, aquí hay un pequeño ejemplo para ayudarlo a comprender.
Supongamos que tiene un punto final del servicio HTTP http://foo.com/search, que acepta un parámetro de consulta P, y el valor de P es la cadena a buscar. Si busca la cadena "You e I", la URL de la búsqueda que creó por primera vez podría ser así: http://foo.com/search?q=you & I. Por supuesto, esto no funcionará, porque y es el separador que separa los pares/pares de valor del parámetro de consulta. Si obtiene esta cadena de URL desordenada, está indefenso porque en primer lugar, no puede analizarla correctamente.
Ok, usemos URLEncoder. Urlencoder.encode ("You & i", "UTF-8") es el resultado de que usted+%26+i. Después de decodificar este %26, es &, y el signo + representa espacios en la cadena de consulta, por lo que esta URL puede funcionar normalmente.
Ahora suponga que desea usar su cadena de consulta para empalmar la ruta de la URL en lugar de colocarla en los parámetros de URL. Obviamente, http://foo.com/search/you & i está equivocado. Desafortunadamente, el resultado de Urlencoder.Encode () también es incorrecto. http://foo.com/search/you+%26+i obtendrá/búsqueda/usted+&+i, porque el signo+no resuelve espacios en la ruta de la URL.
Urlencoder puede satisfacer algunos de sus escenarios. Desafortunadamente, su nombre demasiado genérico facilita a los desarrolladores mal uso. Por lo tanto, la mejor manera es no usarlo, de modo que otros desarrolladores cometan errores al usar otras funciones sobre su base (a menos que realmente esté haciendo "codificación de formulario HTML").
Pregunta 2: Groovy httpbuilder y Uri de Java
HTTP Builder es una biblioteca de clientes HTTP de Groovy.
Crear una solicitud de obtención normal es muy simple:
nuevo httpbuilder ("http: // localhost: 18080") .request (método.get) {uri.path = "/foo"}Este código enviará get /foo http /1.1 al servidor (puede ejecutar nc -l -p 18080 y luego ejecutar este código para verificarlo).
Probemos la URL que contiene espacios.
nuevo httpbuilder ("http: // localhost: 18080") .request (método.get) {uri.path = "/foo bar"}Esto envía get /foo%20bar http /1.1, que se ve bastante bien.
Ahora suponga que hay una sección en nuestra ruta llamada Foo/Bar. Esto no se puede hacer simplemente enviando foo/bar, porque esto se considerará como dos segmentos en el camino, foo y bar. Probemos FOO%2FBAR (reemplazar / con la codificación correspondiente).
nuevo httpbuilder ('http: // localhost: 18080') .request (método.get) {uri.path = '/foo%2fbar'}Esto envía get /foo%252fbar http /1.1. Esto no es muy bueno. %en %2F se codifica repetidamente, por lo que la ruta obtenida después de la decodificación es FOO %2FBAR en lugar de Foo/Bar. Lo real de culpar aquí es java.net.uri, porque la clase Uribuilder en httpbuilder lo usa.
El tipo de propiedad URI expuesta en el cierre de configuración en el código anterior es UriBuilder. Si actualiza la propiedad de ruta del URI a través de URI.path = ..., eventualmente llamará a un constructor del URI. Este método describe la propiedad de la ruta entrante de la siguiente manera:
Si se proporciona el parámetro de ruta, se agrega a la URL. Los caracteres en el camino están codificados siempre que no sean no reservados, puntuados, escapados y otras categorías (Nota del traductor: estas categorías se detallan en RFC 2396), y no son/o @ números.
Este enfoque no es muy significativo, porque si el texto antes de la codificación contiene caracteres especiales, no puede generar un segmento de ruta codificado correctamente. En otras palabras, "codificaré esta cadena, y después de codificarla es correcta", lo cual es, por supuesto, una falacia, y URI es víctima de esta falacia. Si la cadena se ha codificado correctamente, no hay problema. Si no, se hará porque la cadena no se puede analizar. De hecho, lo que dice la documentación no escapa de / significa que supone que la cadena de ruta se ha codificado correctamente (es decir, se usa correctamente para separar las rutas), y no se ha codificado correctamente (las otras partes excepto / aún necesitan ser codificadas).
Sería genial si httpbuilder no usa esta función defectuosa de la clase URI. Por supuesto, sería aún mejor si el URI en sí esté bien.
La forma correcta de hacerlo
Escribimos este constructor de URL, que puede ayudar a los desarrolladores a empalmar fácilmente varios tipos de URL. Sigue las especificaciones de codificación en los materiales de referencia al comienzo del artículo, y también proporciona una API de transmisión. El siguiente ejemplo de uso puede cubrir casi todos los escenarios de uso:
UrlBuilder.forhost ("http", "foo.com") .pathsegment ("con espacios") .pathsegments ("ruta", "con", "varargs") .pathsegment ("& =?/") .Queryparam ("fancy + name", "fancy? = Valor") .matrixparam ("matrix", "param?" ")." "). .TourlString ()El resultado es: http://foo.com/with%20spaces/path/with/varargs/&=%3F%2F;matrix=param%3f?fancy%20%2B%20Name=fancy?%3DValue#%23?=
Este ejemplo demuestra diferentes reglas de codificación para cada parte de la URL. Por ejemplo, el sin codificación & = en la ruta está permitido, mientras que? El número no lo necesita, porque esto ya es parte de la cadena de consulta (nota del traductor: la cadena de consulta comienza con un número, por lo que puede incluir un número después).
Gracias por leer, espero que pueda ayudarte. ¡Gracias por su apoyo para este sitio!