JAX-RS с Джерси: передача параметров формы в метод PUT для обновления ресурса - PullRequest
5 голосов
/ 11 мая 2011

Мне нужно обновить запись Person, имеющую firstName и lastName. Пользователь должен иметь возможность изменить его из HTML-формы, и при отправке он должен быть обновлен.

Вот мой код.

    @PUT
    @Path("/{userId}")
    public Response updatingResource(@FormParam("firstName") String firstName, @FormParam("lastName ") String lastName , @PathParam("userId") String userId){
        System.out.println(firstName);
        System.out.println(lastName);
        return Response.ok().build();
    }

операторы SOP выводят ноль. Я использовал плагин Mozilla Firefox Poster для отправки запроса PUT.

Я также пытался пометить его как @Consumes(MediaType.APPLICATION_FORM_URLENCODED), но все равно он печатает ноль для каждого значения.

Как написать и вызвать метод PUT, который получает эти три значения. Я много спотыкался и обнаружил, что люди просят использовать JSON или XML. Как я могу потреблять JSON? Я был бы очень рад, если бы кто-нибудь помог мне написать метод REST для обновления ресурса


Если я отправлю запрос PUT, используя Firefox RESTClient и Google rest-client , я смогу получить параметры формы. Оба эти инструмента имеют что-то вроде секции тела, где я разместил firstName=Amit&lastName=Patel. Также я добавил заголовок Content-Type как application/x-www-form-urlencoded. Я думаю, что Плакат Firefox содержит ошибки. Кто-нибудь может подсказать мне, есть ли другой способ проверки кода или я могу доверять первым двум клиентам REST?

Ответы [ 3 ]

7 голосов
/ 11 мая 2011

Помимо аннотирования вашего метода с помощью @Consumes(MediaType.APPLICATION_FORM_URLENCODED), вы должны отправить application/x-www-form-urlencoded в качестве типа контента. Ты сделал это?

Отредактировано: Вы можете использовать FormParams только с POST:

SRV.4.1.1 Когда параметры доступны условия, которые должны быть выполнены, прежде чем данные формы будут заполнены набор параметров:

  1. Запрос является запросом HTTP или HTTPS.
  2. Метод HTTP - POST.
  3. Тип содержимого - application / x-www-form-urlencoded.
  4. Сервлет осуществил начальный вызов любого из методов семейства getParameter для объекта запроса. Если условия не выполнены и данные пост-формы не включены в набор параметров, пост данные все еще должны быть доступны сервлету через объект запроса входной поток. Если условия выполнены, данные формы больше не будут быть доступным для чтения непосредственно из ввода объекта запроса поток.
1 голос
/ 13 августа 2012

неверно, что PUT не принимает FormParameters. Я успешно использую @FormParam с PUT. Может быть, это @PathParam. Я этого не пробовал.

Кажется, что нет необходимости в специальных аннотациях. Вот рабочий класс в моем приложении:

package ch.sertal.vision.server.services.objectstore;

import ch.sertal.vision.dao.FormDao;
import ch.sertal.vision.dao.PrepopContentDao;
import ch.sertal.vision.model.Form;
import ch.sertal.vision.model.PrepopContent;
import ch.sertal.vision.model.User;
import ch.sertal.vision.model.exceptions.NotLoggedinException;
import ch.sertal.vision.server.services.AbstractSertalService;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.List;
import java.util.Set;

@Path( "jsonrest/prepop" )
public class PrepopContentStore extends AbstractSertalService {

   @GET
   @Path( "list" )
   @Produces( "application/json" )
   public Response getPrepopEntries( @QueryParam( "formId" ) Long formId ) {
      User user;
      try {
         user = getUser();
      } catch ( NotLoggedinException e ) {
         return Response.status( Response.Status.UNAUTHORIZED ).build();
      }

      PrepopContentDao prepopContentDao = new PrepopContentDao( db );
      List<PrepopContent> contentList = prepopContentDao.list( user, formId );

      JSONArray jsPrepops = new JSONArray();
      for ( PrepopContent content : contentList ) {
         jsPrepops.add( prepopContentDao.getJsContent( content, user ) );
      }

      return Response.ok( jsPrepops.toJSONString(), MediaType.APPLICATION_JSON_TYPE ).build();
   }

   @PUT
   @Produces( "application/json" )
   public Response newPrepopContent( @FormParam( "formId" ) Long formId ) {
      User user;
      try {
         user = getUser();
      } catch ( NotLoggedinException e ) {
         return Response.status( Response.Status.UNAUTHORIZED ).build();
      }

      Form form = (new FormDao( db)).get( formId );

      PrepopContent content = new PrepopContent( form, "" );
      content.setTenant( user.getMainTenant() );
      PrepopContentDao prepopContentDao = new PrepopContentDao( db );
      content = prepopContentDao.save( content );

      return Response.ok( prepopContentDao.getJsContent( content, user ).toJSONString(),
                  MediaType.APPLICATION_JSON_TYPE ).build();
   }

}

Он вызывается из jQuery так:

    $.ajax( {
       url:"${pageContext.request.contextPath}/services/jsonrest/prepop",
       type:"PUT",
       async:true,
       data: [{name: "formId", value: that.formId}],
       success:function ( prepopContent ) {
          listContainer.append( "<div>" + template( prepopContent ) + "</div>" );
       }
    } );

$ {pageContext.request.contextPath} из JSP

1 голос
/ 11 мая 2011

В качестве альтернативы вы можете использовать подход, указанный в Перезаписать HTTP-метод с помощью JAX-RS :

В основном вы бы добавили скрытый параметр / HTTP-заголовок, а затем POST-форму.В вашем сервлете вы добавляете фильтр, который проверяет определенный заголовок / скрытый элемент формы и изменяет запрос POST на запрос PUT.Это перенаправляется на ваш ресурс и корректно расходуется при добавлении аннотации с PUT.

...