用于添加/删除数组元素的RESTful API端点?

时间:2013-03-12 19:27:43

标签: api http mongodb rest

我在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's API的做法。如何更新name并同时从items删除元素?例如,当我在管理仪表板上更新一堆用户的详细信息时?我不认为在mongodb中更换整个阵列是一个好主意吗?

2 个答案:

答案 0 :(得分:13)

传递mongodb查询似乎是一个坏主意。根据您的后端实施情况,可能会导致攻击者对您的数据执行错误操作,如SQL Injection

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

  • 使用PUT时,客户端应发送资源的整个表示。它适合您,但可能很麻烦。
  • 使用PATCH时,客户端应发送要更改的属性,而不是整个资源。但是,您必须发送整个值,而不仅仅是向值添加或删除项目。它再次起作用,但你并不喜欢它。

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

  1. 我会将数组建模为资源:/users/:id/items
  2. 接受POST将数据添加到数组中,并DELETE从数组中删除。
  3. 这很简单,很简单。

答案 1 :(得分:-1)

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

我可以举例说明java中的高级HTTP端点如何使用Jersey。 您可以使用指定了HTTP路径的Resource类,以及执行不同操作的方法的特定路径。 所以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/