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

tha*_*vin 17 api rest http mongodb

我在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中更换整个阵列是一个好主意吗?

Dan*_*edo 14

传递mongodb查询似乎是一个坏主意.根据您的后端实现,它可能导致攻击者像SQL注入一样对数据执行错误操作

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

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

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

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

它简单而且RESTful.


Pra*_*xit -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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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