2016-03-01 7 views
7

Je dois implémenter une API avec ces paramètres de chemin.Comment créer une API REST avec des paramètres optionnels?

@Path("/job/{param1}/{optional1}/{optional2}/{param2}") 

Les deuxième et troisième paramètres peuvent-ils être optionnels? Donc, le client n'a pas besoin de passer ces derniers, mais doivent passer le premier et le dernier.

Si cela n'est pas possible, alors est-il recommandé de réorganiser les paramètres de cette façon?

@Path("/job/{param1}/{param2}/{optional1}/{optional2}") 

Comment fournir les paramètres facultatifs?

+0

il est préférable de réorganiser les paramètres, Si j'avais le choix, j'aurais séparé obligatoire et facultatif dans 2 sections, séparées par un délimiteur dans l'URL, puis rendre obligatoire comme positionnel, et facultatif comme paire de valeur clé, je ne t savoir comment, quel client, sous quel scénario vous écrivez le code, qu'avez-vous essayé jusqu'à présent? – abasu

+0

@abasu J'utilise JAX-RS. J'ai fait référence à http://www.nakov.com/blog/2009/07/15/jax-rs-path-pathparam-and-optional-parameters/. Est-il nécessaire d'utiliser regex, ou existe-t-il un autre moyen? – mbgsuirp

+0

Comment distingueriez-vous 'optional1' et' optional2' dans '/ job/foo/bar/baz'? Qu'est-ce que 'bar'? –

Répondre

3

Vous pouvez faire correspondre le chemin complet se termine par la demande REST

@Path("/location/{locationId}{path:.*}") 
public Response getLocation(
    @PathParam("locationId") int locationId, 
    @PathParam("path") String path) { 
    //your code 
} 

Maintenant, la variable de chemin contient chemin entier après location/{locationId}

Vous pouvez également utiliser des expressions régulières pour faire chemin facultatif.

@Path("/user/{id}{format:(/format/[^/]+?)?}{encoding:(/encoding/[^/]+?)?}") 
public Response getUser(
    @PathParam("id") int id, 
    @PathParam("format") String format, 
    @PathParam("encoding") String encoding) { 
    //your code 
} 

Maintenant, si le formatage et l'encodage sont optionnels. Vous ne donnez aucune valeur, ils seront vides.

+2

Esprit mentionnant la source? http://www.nakov.com/blog/2009/07/15/jax-rs-path-pathparam-and-optional-parameters/ –

1

Réorganiser les params et les opérations suivantes:

@Path("/job/{param1}/{param2}{optional1 : (/optional1)?}{optional2 : (/optional2)?}") 
public Response myMethod(@PathParam("param1") String param1, 
         @PathParam("param2") String param2, 
         @PathParam("optional1") String optional1, 
         @PathParam("optional2") String optional2) { 
    ... 
} 
7

Il pourrait être plus facile de tourner les paramètres de chemin en option dans les paramètres de la requête. Vous pouvez ensuite utiliser @DefaultValue si vous en avez besoin:

@GET @Path("/job/{param1}/{param2}") 
public Response method(@PathParam("param1") String param1, 
    @PathParam("param2") String param2, 
    @QueryParam("optional1") String optional1, 
    @QueryParam("optional2") @DefaultValue("default") String optional2) { 
    ... 
} 

Vous pouvez ensuite appeler à l'aide /job/one/two?optional1=test passant uniquement les paramètres facultatifs dont vous avez besoin.