我在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中更换整个阵列是一个好主意吗?
答案 0 :(得分:13)
传递mongodb查询似乎是一个坏主意。根据您的后端实施情况,可能会导致攻击者对您的数据执行错误操作,如SQL Injection
您可以使用PUT或PATCH对资源上的属性修改进行建模,但有一些限制:
PUT
时,客户端应发送资源的整个表示。它适合您,但可能很麻烦。PATCH
时,客户端应发送要更改的属性,而不是整个资源。但是,您必须发送整个值,而不仅仅是向值添加或删除项目。它再次起作用,但你并不喜欢它。我认为您正在寻找一种方法来为数组添加和删除项目:
/users/:id/items
POST
将数据添加到数组中,并DELETE
从数组中删除。这很简单,很简单。
答案 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/