Конечная точка API RESTful для добавления/удаления элементов массива?
У меня есть RESTful API, построенный поверх магазина MongoDB, поэтому хорошо, что вы можете хранить массивы. Прямо создать новый ресурс, подобный этому:
POST /users
{
items: [
1001, 1002, 1003
]
}
Но как будет выглядеть конечная точка HTTP для добавления нового элемента или удаления элемента?
Сейчас я должен указать весь массив, включая элементы, которые я не хочу трогать:
PATCH /users/{id}
{
name: 'Bruce Wayne',
items: [
1001, 1002
]
}
Или напрямую передайте запрос mongodb:
PATCH /users/{id}?query[$push][items]=1003
Есть ли лучший способ сделать это?
Edit:
Мне нравится, как это делает API StackMob. Как обновить name
и удалить элемент из items
одновременно? Например, когда я обновляю кучу деталей пользователя на панели управления администратора? Я не думаю, что замена всего массива - хорошая идея в mongodb?
Ответы
Ответ 1
Передача запроса mongodb кажется плохой идеей. В зависимости от вашей реализации бэкэнд это может привести к тому, что злоумышленник сделает ваши плохие вещи, как в SQL Injection
Вы можете моделировать модификацию атрибута ресурса с помощью PUT или PATCH с некоторыми ограничениями:
- При использовании
PUT
ожидается, что клиент отправит все представление ресурса. IT работает для вас, но это может быть громоздким.
- При использовании
PATCH
ожидается, что клиент отправит атрибуты, предназначенные для изменения, вместо всего ресурса. Тем не менее, вам нужно отправить все значение, а не только добавления или удаления элементов в значение. Снова это работает, но вы не любите его.
Я думаю, вы ищете способ моделирования и добавления элементов в массив:
- Я бы сам моделировал массив как ресурс:
/users/:id/items
- Принять
POST
, чтобы добавить элемент в массив и DELETE
для удаления из массива.
Это простой и RESTful.
Ответ 2
В соответствии со стандартами REST для создания и удаления нового запроса → POST -Создание нового ресурса в коллекции
а также
DELETE -Удалить ресурс
Я могу привести вам пример того, как конечная точка HTTP высокого уровня в java выглядит как использование Джерси.
Вы можете иметь класс ресурсов с указанным 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/