Search code examples
javaspringjersey

How can I pass string path param containing slash character?


I have this REST resource:

@GET
@Path("{business},{year},{sample}")
@Produces(MediaType.APPLICATION_JSON)
public Response getSample(
        @PathParam("business") String business,
        @PathParam("year") String year,
        @PathParam("sample") String sampleId {
    Sample sample = dao.findSample(business, year, sampleId);
    return Response.ok(sample).build();
}

sample param can contain slash character: 6576/M982, for instance.

I'm calling it with http://ip:port/samples/2000,2006,6576/M982 but does not work, obviously.

I have also tried with http://ip:port/samples/2000,2006,6576%2FM982, encoding the slash as %2F, but doesn't work either, it doesn't reach the endpoint.

EDIT

I'm using Retrofit to call the endpoint and I do this:

@GET("/samples/{business},{year},{sampleId}")
Observable<Sample> getSampleById(
        @Path("business") String business,
        @Path("year") String year,
        @Path(value = "sampleId", encoded = true) String sampleId);

With encoded = true, but still not working.


Solution

  • Reserved characters such as , and / must be URL encoded.

    • , is encoded as %2C
    • / is encoded as %2F

    Try http://ip:port/samples/2000%2C2006%2C6576%2FM982.


    The RFC 3986 defines the following set of reserved characters that can be used as delimiters. Hence, they require URL encoding:

    : / ? # / [ ] / @ ! $ & ' ( ) * + , ; =
    

    Unreserved characters do not require URL encoding:

    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    0 1 2 3 4 5 6 7 8 9 - _ . ~
    

    If URL encoding , is not a good alternative for you, you could consider using query parameters. Your code will be like:

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getSample(@QueryParam("business") String business, 
                              @QueryParam("year") String year,
                              @QueryParam("sample") String sampleId {
        ...
    }
    

    And your URL will be like http://ip:port/samples?business=2000&year=2006&sample=6576%2FM982.

    Please note that the / still needs to be URL encoded.