如何在没有ID的情况下将Restangular转换为PUT?

时间:2014-06-24 18:24:39

标签: javascript angularjs rest restangular

我正在为一个Web应用程序开发前端,这个应用程序有一些非正统的“RESTful”后端。 CRUD操作如下所示:

model
  GET    :id
  POST   {payload}
  PUT    {payload}
  DELETE :id

换句话说,PUT操作没有ID。相反,后端从有效负载对象中检索ID。当Restangular尝试为单个资源生成URL时,这会产生问题:

Restangular.one('model', 2).get().then ($model) ->
  $model.name = 'newName'
  $model.save()

然后由Restangular生成的请求是:

PUT /model/2

当我真正需要它时

PUT /model

有没有以编程方式可靠的方法来实现这一目标?它仅适用于更新记录。谢谢!

2 个答案:

答案 0 :(得分:0)

如果您将整个对象传递到PUT的主体中,就像使用POST一样,您不必具有id值。您需要做的是确定更新代码正文的正确记录。服务层中的内容如下:

//Get Disposition Methods for test app
    //Method which should return a single Disposition object in JSON format
    @GET
    @Path("/disposition/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Disposition getDispositionById(@PathParam("id") int id){
    . . .
    }


    //Method which should return a list of all Dispositions in JSON format
    @GET
    @Path("/disposition")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Disposition> getAllDispositions(){
     . . .
    }

    //Method to delete a specific Disposition
    @DELETE
    @Path("/disposition/{id}")
    public void deleteDispositionById(@PathParam("id") int id){
     . . .
    }

    //Creation of a new Disposition
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @Path("/disposition")
    public Response createNewDisposition(String body){
        Disposition disposition = new Disposition();
        log.info("---- POST"+body);
        body = "["+body+"]";
        try{
         . . .//create Java object from body of post

       }catch(JSONException e){
        . . .
       }
        try{
         . . .//save new object
        }
        catch(Exception e){
        . . .
        }

    }

    //update an existing Disposition
    @PUT
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @Path("/disposition")
    public Response updateNewDisposition(String body){
        Disposition disposition = null;
        log.info("---- Put "+body);
        body = "["+body+"]";
        try{
         . . . .//find and update record

       }catch(JSONException e){
          . . . .
       }

    }

如您所见,在这种情况下,PUT不包含id标记。不确定它的效率如何,但它确实有效。

泰德

答案 1 :(得分:0)

你可以这样做:

Restangular.one('model').customPUT($model.plain());

使用上述代码以及Restangular.serviceRestangular.extendModel,您可以定义自己的save()