Как мы можем отправить неаннотированный параметр метода в запросе, используя Джерси?

Сегодня, когда я просматривал документацию по Джерси, я наткнулся на следующее утверждение.

 Unlike method parameters that are associated with the extraction of request parameters, 
 the method parameter associated with the representation being consumed does not require 
 annotating.  A maximum of one such unannotated method parameter may exist since there 
 may only be a maximum of one such representation sent in a request.

Я новичок в JAX-RS, поэтому не очень понимаю, как мы отправляем такой параметр в запросе (я не нахожу конкретного примера, чтобы лучше понять)

Из приведенного выше утверждения я понимаю, что у нас мог бы быть ресурсный метод, который некоторые думают как

 @Path("restful")
 public class MyResource{
   ...
   @GET
   @Produces("application/text")
   public String getStringResp(String param){
      ...
      return "some value";
   }
   ....
 }

Здесь мы не используем никаких аннотированных параметров, таких как путь, матрица, запрос или любые другие параметры.

Теперь мой вопрос: как на стороне клиента мы можем отправить значение параметра метода «param»? Мы могли бы использовать методы API, такие как queryparam() и т. д., в «webtarget» или «invocationBuilder», чтобы отправить параметр запроса, если параметр аннотирован соответственно. Здесь это не так.

Пожалуйста, помогите мне понять это?

заранее спасибо


person HJK    schedule 23.12.2014    source источник


Ответы (2)


Первое, что нужно понять, это то, что запрос состоит в основном из двух частей: тела и заголовков. В опубликованной вами документации говорится, что параметр без аннотаций в конечном итоге является телом запроса.

Обычно вы не отправляете тело объекта с запросом GET, но для PUT и POST существуют put(Entity<?> entity) и post(Entity<?> entity), который Ivocation.Builder наследуется от SyncInvoker.

Класс Entity имеет статические методы из который мы можем сформировать тело сущности. Например

                        // application/json data
target.request().post(Entity.json(jsonStringDataOrPojo));

                        // application/xml data
target.request().post(Entity.xml(xmlStringDataOrPojo));

                        // text/plain data
target.request().post(Entity.entity(stringData, MediaType.TEXT_PLAIN));

                        // text/plain data 
target.request().post(Entity.text(stringData));

В вашем случае с String вы можете отправить любой из них. Поскольку вы не указали аннотацию @Consumes в методе ресурса, это может быть простой текст xml или json. Для xml и json вы просто получите данные в необработанном виде.

Если у тебя есть

@POST
@Consumes(MediaType.TEXT_PLAIN)
public Response postString(String param){

Затем вам нужно будет отправить его обычным текстом, т.е. одним из последних из приведенных выше примеров.


person Paul Samsotha    schedule 23.12.2014
comment
Привет Peeskillet, у меня есть одно сомнение. Как это значение будет отправлено в запросе. Будет ли это частью полезной нагрузки сообщения и как она будет идентифицирована на стороне сервера, если будет отправлена ​​как часть полезной нагрузки. Поправьте меня, если я ошибаюсь. Спасибо - person HJK; 23.12.2014
comment
Просто отправьте его как Entity.text(stringData) с post. Но вам нужно убедиться, что ваш ресурсный метод на стороне сервера имеет @POST, а не @GET. Что касается сервера, все данные должны быть неупорядочены. Для этого есть MessageBodyReaders для разных типов. В основном происходит то, что, поскольку тип параметра равен String, JAX-RS будет искать MessageBodyReader, чтобы разобрать поток данных в строку, а затем передать его вашему методу. - person Paul Samsotha; 23.12.2014
comment
Дополнительные сведения см. в главе 6–8. - person Paul Samsotha; 23.12.2014
comment
Если вы просто спрашиваете, как сервер узнает, что это тело, то это потому, что оно не аннотировано. - person Paul Samsotha; 23.12.2014

Вам действительно следует использовать @PathParam("param") для параметра метода, например @PathParam("param") param, если вы хотите узнать больше, я предлагаю посмотреть исходный код.

person user4387011    schedule 23.12.2014