23

我在 MongoDB 存储之上构建了 RESTful API,因此可以存储数组非常好。像这样创建新资源很简单:

POST /users { items: [ 1001, 1002, 1003 ] }

但是用于添加新项目或删除项目的 HTTP 端点会是什么样子?

现在,我必须指定整个数组,包括我不想接触的元素:

PATCH /users/{id} { name: 'Bruce Wayne', items: [ 1001, 1002 ] }

或者直接传入一个mongodb查询:

PATCH /users/{id}?query[$push][items]=1003

有一个更好的方法吗?

编辑:

我喜欢StackMob 的 API是如何做到的。但是,如何同时更新name和删除元素items?例如,当我在管理仪表板上更新一堆用户的详细信息时?我认为在 mongodb 中替换整个数组不是一个好主意?

4

2 回答 2

25

传递 mongodb 查询似乎是个坏主意。根据您的后端实现,它可能会导致攻击者对您的数据做坏事,如SQL 注入

您可以使用 PUT 或 PATCH 对资源上的属性修改进行建模,但有一些限制:

  • 当使用PUT客户端时,期望发送资源的整个表示。它适合你,但它可能很麻烦。
  • 使用PATCH客户端时,期望发送打算更改的属性,而不是整个资源。但是,您必须发送整个 value,而不仅仅是对 value 的项目的添加或删除。它再次起作用,但你不爱它。

我认为您正在寻找一种方法来模拟向数组添加和删除项目:

  1. 我会将数组建模为自己的资源:/users/:id/items
  2. 接受POST将项目添加到数组并DELETE从数组中删除。

它简单且 RESTful。

于 2015-11-16T17:32:25.987 回答
-1

根据 REST 标准创建和删除新请求 --> POST - 在集合中创建新资源并 DELETE - 删除资源

我可以给你一个例子,说明 Java 中的高级 HTTP 端点是如何使用 Jersey 的。您可以拥有一个资源类,其中指定了 HTTP 路径和特定路径,用于执行不同操作的方法。所以 URL 可能看起来像 - /rest/MyResource/Resource 伴随着请求 JSON 或 XML(包含您的输入数据)

这是一个示例资源类,它将作为您的入口点(当然,您必须在 web.xml 中进行配置才能为此类进行 URL 映射)-->

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.DELETE;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.json.JSONObject;

public class SampleRESTServiceResource {

    /**
     * @param incomingJsonString
     * @return Response 
     */
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response createNewResource(JSONObject myJson) {
        // Do a call to a DAO Implementation that does a JDBC call to insert into Mongo based on JSON
        return null;

    }

    /**
     * @param incomingJsonString
     * @return Return response 
     */
    @DELETE
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response deleteResource(JSONObject myJson) {
        // Do a call to a DAO Implementation that does a JDBC call to delete resource from  Mongo based on JSON
        return null;
    }
}

如果你想尝试一个例子,你可以参考这个页面 --> https://www.ibm.com/developerworks/library/wa-aj-tomcat/

于 2014-02-19T10:27:08.660 回答