Подтвердить что ты не робот

Конечная точка 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?

4b9b3361

Ответ 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/