2014-02-06 2 views
3

Я использую jersey-клиент для отправки параметра запроса на мой Джерси-сервер. Это запрос: ?sort=id+ASCJersey 1.x заменяет символ плюса символом пробела. Как я могу это предотвратить?

Но в моем коде, который извлекает этот параметр запроса, return uriInfo.getQueryParameters().getFirst("sort");, это значение принимает значение id ASC. Почему это происходит и как я могу это предотвратить?

+2

Строка запроса из 'сортировки = ид + ASC? '_does_ представляет значение параметра« id ASC », потому что строки запроса« application/x-www-form-urlencoded ». Если вы хотите отправить значение параметра «id + ASC», вам нужно будет использовать строку запроса '? Sort = id% 2BASC' –

+0

@IanRoberts, которую я вижу. Наверное, я могу просто жить с ним. –

ответ

5

Помимо @ предложения IanRoberts, вы могли бы сделать использование @Encoded аннотацию, чтобы добраться до исходного значения недекодированного вас параметр (по умолчанию Джерси декодирует значения, и поэтому id+ASC становится id ASC в вашем коде).

Следующий пример возвращает декодированное значение, как для поведения по умолчанию:

@GET 
@Produces(MediaType.TEXT_PLAIN) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public Response test(@QueryParam("sort") String sort) { 
    // sort is "id ASC" 
    return Response.ok().entity(sort).build(); 
} 

Чтобы изменить поведение, вы просто добавить @Encoded:

@GET 
@Produces(MediaType.TEXT_PLAIN) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public Response test(@QueryParam("sort") @Encoded String sort) { 
    // sort is "id+ASC" 
    return Response.ok().entity(sort).build(); 
} 
+0

Существует ли это '@ Encoded' в 1.x? –

+1

@tieTYT: Да. Я сделал быстрый поиск, чтобы увидеть, в какой версии он был добавлен, и кажется, что он существует с 1.4: https://jersey.java.net/apidocs/1.4/jersey/javax/ws/rs/Encoded.html – Bogdan

Смежные вопросы