servicio pathparam parametros ejemplo crear consumir con java rest servlets jax-rs path-parameter

java - parametros - pathparam spring



Almacene los valores @PathParam de la llamada REST en una lista o matriz (2)

Puede ser una buena oportunidad para repensar este diseño. Al usar / s, estamos de alguna manera significando, con cada / que estamos tratando de ubicar un recurso diferente. Los pares clave / valor (en el contexto de la URL) son principalmente para parámetros de consulta o parámetros de matriz.

Si /property/{uuid} es la ruta a un recurso principal, y solo queremos ofrecer algunos parámetros al cliente para acceder a este recurso, entonces podríamos permitir los parámetros de la matriz o los parámetros de consulta

Los parámetros de la matriz (en una URL de solicitud) se verán como

/12345;key1=value1;key2=value2;key3=value3

Un método de recursos para obtener los valores puede parecerse a algo

@GET @Path("/property/{uuid}") public Response getMatrix(@PathParam("uuid") PathSegment pathSegment) { StringBuilder builder = new StringBuilder(); // Get the {uuid} value System.out.println("Path: " + pathSegment.getPath()); MultivaluedMap matrix = pathSegment.getMatrixParameters(); for (Object key : matrix.keySet()) { builder.append(key).append(":") .append(matrix.getFirst(key)).append("/n"); } return Response.ok(builder.toString()).build(); }

Los parámetros de consulta (en una URL de solicitud) pueden parecerse a

/12345?key1=value1&key2=value2&key3=value3

Un método de recursos para obtener los valores puede parecerse a algo

@GET @Path("/property/{uuid}") public Response getQuery(@PathParam("uuid") String uuid, @Context UriInfo uriInfo) { MultivaluedMap params = uriInfo.getQueryParameters(); StringBuilder builder = new StringBuilder(); for (Object key : params.keySet()) { builder.append(key).append(":") .append(params.getFirst(key)).append("/n"); } return Response.ok(builder.toString()).build(); }

La diferencia es que los parámetros de Matrix pueden integrarse en segmentos de ruta, mientras que los parámetros de consulta deben colocarse al final de la URL. También puede notar una pequeña diferencia en la sintaxis.

Algunos recursos

ACTUALIZAR

También mirando el PUT en su firma de método, parece que está intentando actualizar un recurso usando la ruta como los valores que está tratando de actualizar, ya que no veo ningún parámetro en su método para un cuerpo de entidad. Al aplicar PUTting, debe enviar la representación en el cuerpo de la entidad, no como segmentos de ruta o parámetros.

Mi función se ve así:

@PUT @Path("property/{uuid}/{key}/{value}") @Produces("application/xml") public Map<String,ValueEntity> updateProperty(@Context HttpServletRequest request, @PathParam("key") String key, @PathParam("value") String value, @PathParam("uuid") String uuid) throws Exception { ... }

Tengo que modificarlo, así que acepta una lista indefinida (o muchas) de pares clave-valor de la llamada REST, algo así como

@Path("property/{uuid}/{key1}/{value1}/{key2}/{value2}/{key3}/{value3}/...")

¿Es posible almacenarlos en una matriz o lista, por lo que no enumerar docenas de @PathParams y parámetros, para evitar esto:

@PathParam("key1") String key1, @PathParam("key2") String key2, @PathParam("key3") String key3,


Una solución:

@Path("/foo/bar/{other: .*} public Response foo(@PathParam("other") VariableStrings vstrings) { String[] splitPath = vstrings.getSplitPath(); }

Clase VariableStrings:

public class VariableStrings { private String[] splitPath; public VariableStrings(String unparsedPath) { splitPath = unparsedPath.split("/"); } }

Secuencia del segmento de ruta a la matriz vararg en JAX-RS / Jersey?

Otro ejemplo donde mapea el parámetro opcional a un Mapa:

@GET @ Produces({"application/xml", "application/json", "plain/text"}) @ Path("/location/{locationId}{path:.*}") public Response getLocation(@PathParam("locationId") int locationId, @PathParam("path") String path) { Map < String, String > params = parsePath(path); String format = params.get("format"); if ("xml".equals(format)) { String xml = "<location<</location<<id<</id<" + locationId + ""; return Response.status(200).type("application/xml").entity(xml).build(); } else if ("json".equals(format)) { String json = "{ ''location'' : { ''id'' : ''" + locationId + "'' } }"; return Response.status(200).type("application/json").entity(json).build(); } else { String text = "Location: id=" + locationId; return Response.status(200).type("text/plain").entity(text).build(); } } private Map < String, String > parsePath(String path) { if (path.startsWith("/")) { path = path.substring(1); } String[] pathParts = path.split("/"); Map < String, String > pathMap = new HashMap < String, String > (); for (int i = 0; i < pathParts.length / 2; i++) { String key = pathParts[2 * i]; String value = pathParts[2 * i + 1]; pathMap.put(key, value); } return pathMap; }