我正在为一个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
有没有以编程方式可靠的方法来实现这一目标?它仅适用于更新记录。谢谢!
答案 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.service
和Restangular.extendModel
,您可以定义自己的save()
。