Джерси @Path не может обработать вопросительный знак ('?') - PullRequest
1 голос
/ 14 ноября 2011

У меня есть два REST URL, например:

http://myschool/student/jack //get student information.
http://myschool/student/jack?books //get student books.

код:

@Path("student")
public class StudentResource {

    @GET
    @Path("{name}")
    public Response getInformation(@PathParam("name") String name) {
        return Response.ok(loadStudentInformation(name));
    }

    @GET
    @Path("{name}?books") //ineffective expression
    public Response getBooks(@PathParam("name") String name) {
        return Response.ok(loadStudentBooks(name));
    }

Джерси не может обработать второй URL-адрес 'http://myschool/student/jack?books',, он всегда отправляет входящий запрос, который заканчивается'? Books ', первому методу' getInformation '.

Я пытаюсь использовать регулярное выражение, как это:

    @GET
    @Path("{name : .*(\\?books$)}") //ineffective expression
    public Response getBooks(@PathParam("name") String studentName) {

Регулярное выражение тоже неэффективно, может кто-нибудь, пожалуйста, помогите мне разобраться, как это реализовать.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Если вам действительно нужно использовать вопросительный знак для разделения {name} и книг, вы можете сделать это следующим образом:

@GET
@Path("{name}")
public Response getInformation(@PathParam("name") String name, @QueryParam("books") String books) {
    if (books != null) {
        // "books" was included after the question mark
        return getBooks(name);
    } else {
        // "books" was not included after the question mark
        return Response.ok(loadStudentInformation(name));
    }
}

public Response getBooks(String name) {
    return Response.ok(loadStudentBooks(name));
}

ОБНОВЛЕНИЕ: Кроме того, если вы используете знак вопроса, где косая черта была бы более подходящей (как в соответствии со спецификацией, знак вопроса запускает раздел параметров запроса), в качестве другой альтернативы вы можете рассмотреть написание ContainerRequestFilter, который заменяет знак вопроса запрос косой чертой - это позволит вам спроектировать свои ресурсы, как предлагает другой ответ, не нарушая совместимость API.

Фильтр может быть таким простым:

public class QueryParamToPathSegmentFilter implements ContainerRequestFilter {

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        String requestUri = request.getRequestUri().toString();
        requestUri = requestUri.replace('?', '/');
        request.setUris(request.getBaseUri(), UriBuilder.fromUri(requestUri).build());
        return request;
    }

}

В зависимости от того, как выглядит ваш URI - вы можете сделать его более сложным. Вот больше о том, как вы можете зарегистрировать фильтры в вашем приложении: http://jersey.java.net/nonav/apidocs/latest/jersey/com/sun/jersey/api/container/filter/package-summary.html

0 голосов
/ 14 ноября 2011

Вы можете просто установить путь к:

@Path("{name}/books")

вместо:

@Path("{name}?books")

и тогда вы получите список книг по этому адресу:

http://myschool/student/jack/books //get student books.

Вопросительный знак в URL-адресе обычно означает, что вы хотите передать параметры службе (в этом случае вы захотите использовать QueryParam), но я не думаю, что это то, о чем здесь речь, вы просто хочу создать другой сервис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...