Java: mejor forma de analizar una URL de recurso RESTful

¿Qué tal jersey UriTemplate?

import com.sun.jersey.api.uri.UriTemplate;

...

String path = "/foos/foo/bars/bar";

Map<String, String> map = new HashMap<String, String>();
UriTemplate template = new UriTemplate("/foos/{foo}/bars/{bar}");
if( template.match(path, map) ) {
    System.out.println("Matched, " + map);
} else {
    System.out.println("Not matched, " + map);
}       
Respuesta 1

Recientemente resolví este problema en una de mis aplicaciones. Mis URL se ven así.

/categories/{category}/subcategories/{subcategory}

Mi problema era que quería mapear cada patrón de URL con una clase Java, para poder recurrir a la clase correcta para representar los datos.

Mi aplicación usa Netty, pero el solucionador de URL no usa ninguna biblioteca de terceros.

Lo que esto me permite hacer es analizar la URL que ingresa desde el navegador, generar un mapa que tenga pares clave-valor (en este caso, categoría y subcategoría), así como crear una instancia del controlador correcto para cada patrón de URL único . En total, solo unas 150 líneas de código Java para el análisis, la configuración de la aplicación y la definición de los patrones de URL únicos.

Puede ver el código para el solucionador en GitHub: https://github.com/joachimhs/Contentice/blob/master/Contentice.api/src/main/java/no/haagensoftware/contentice/util/URLResolver.java

UrlResolver.getValueForUrl devolverá un URLData con la información que necesita sobre su URL: https://github.com/joachimhs/Contentice/blob/master/Contentice.api/src/main/java/no/haagensoftware/contentice/data /URLData.java

Una vez que esto está configurado, puedo asociar las URL con Netty Handlers:

 this.urlResolver.addUrlPattern("/categories", CategoriesHandler.class);
 this.urlResolver.addUrlPattern("/categories/{category}", CategoryHandler.class);
 this.urlResolver.addUrlPattern("/categories/{category}/subcategories", SubCategoriesHandler.class);
 this.urlResolver.addUrlPattern("/categories/{category}/subcategories/{subcategory}", SubCategoryHandler.class);

Dentro de mis controladores, simplemente puedo obtener el mapa de parámetros:

String category = null;
logger.info("parameterMap: " + getParameterMap());
if (getParameterMap() != null) {
    category = getParameterMap().get("category");
}

Espero que eso ayude :)

Respuesta: 2

Tuve el mismo problema que usted y, como no encontré ninguna biblioteca adecuada, decidí escribir URL-RESTify . Puede usarlo o simplemente echar un vistazo para escribir su propia solución, es un proyecto pequeño.

Respuesta: 3

El UriTemplate de Jersey mencionado en otras respuestas es bueno, pero es una gran biblioteca y también incluye muchas otras bibliotecas de dependencias.

Pequeña solución sin dependencia: https://github.com/xitrum-framework/jauter

Respuesta: 4

Creo que primero debe crear un marco para almacenar el método REST y las asignaciones de clase + método en un archivo de propiedades o en una estructura de datos de memoria. Luego, escriba un servlet de nivel superior aceptando toda su solicitud REST. Dependiendo de la URL que comience desde su contexto, puede intentar buscar el mapeo de su estructura de datos de memoria / archivo de propiedades para averiguar qué clase y a qué método debe llamarse. Luego, haciendo uso de la reflexión, puede llamar al método deseado. Tome la respuesta del método y póngala en el formato de tipo de contenido deseado y envíela de vuelta al flujo de salida de respuesta del servlet.

Respuesta: 5

Estoy escribiendo una araña web muy básica en Java. Me enfrento a un problema, que el contenido cargado para la misma URL es diferente al del navegador. Por ejemplo, intente debajo de la URL. http: //www.google.co.in/search? ...

Tenemos dos versiones de Java en nuestro servidor Java 1.6 y Java 1.7. ¿Hay alguna manera de averiguar cuáles son las aplicaciones que se ejecutan en la máquina que llama a la versión? Nuestro requisito es ...

Estamos creando una aplicación web con Scala, Play Framework y MongoDB (con ReactiveMongo como nuestro controlador). La arquitectura de la aplicación no se bloquea de principio a fin. En algunas partes de nuestro código, necesitamos ...

Tengo que escribir un método recursivo que contará la suma de todos los números pares que no se pueden dividir con 7 en un intervalo de forma 1 hasta un parámetro. No puedo usar ningún bucle. Así de lejos llegué ...