Параметры сопоставления параметров ввода-вывода в методы ресурсов в JAX-RS

Веб-API Amazon использует "API запросов" для операций без CRUD, используя параметр querystring для указания операции. Я хочу реализовать операции с не-CRUD аналогичным образом.

Есть ли способ сопоставить метод POST-ресурса с использованием Джерси JAX-RS в зависимости от значения конкретного параметра querystring? Например, я хотел бы сделать что-то вроде этого:

@POST @Query(name="xaction", value="move") 
public Response move(@QueryParam("source") String source, @QueryParam("dest") String dest)
{
...
}

@POST @Query(name="xaction", value="copy")
public Response copy(@QueryParam("source") String source, @QueryParam("dest") String dest)
{
...
}

В приведенном выше примере я ожидал бы, что структура отправит соответствующий метод в зависимости от значения параметра "xaction" querystring независимо от пути URI. К сожалению, у меня нет роскоши использовать пути или методы, чтобы отличить эти операции. Я открыт для других предложений библиотеки, которые совместимы с JAX-RS или пользовательскими реализациями, чтобы решить эту проблему.

1 ответ

REST не является удаленным вызовом процедур (RPC). Даже если Amazon публикует API как это, он все еще не RESTful.

JAX-RS не обеспечивает отображение, которое вы описываете по уважительным причинам. Каждый ресурс должен быть однозначно идентифицирован с помощью URI, который включает полный путь и все параметры запроса. URI, как вы описываете, не идентифицирует ресурсы, а вызывает процедуры.

Задайте себе следующие вопросы:

  1. Каковы ваши ресурсы?
  2. Действия в ресурсах легко сопоставляются с HTTP-глаголами?
  3. Если нет, можете ли действия по ресурсам меня смоделировать как Ресурсы?

В качестве примера для 3. вы можете иметь дело с MoveResource и CopyReource.

JSON Представление MoveResource может выглядеть так:

{
 "source": "/path/to/source",
 "dest": "/path/to/dest"
}

Создание такого MoveResource и, таким образом, запуск перемещения может быть выполнено POST для коллекции Resource at /moves move. Этот POST будет возвращен 201 Created с заголовком Location подобным /moves/42. GET для этого ресурса может вернуть состояние MoveResource:

{
 "source": "/path/to/source",
 "dest": "/path/to/dest",
 "status": "success"
}

То же самое можно сделать для CopyResource.

licensed under cc by-sa 3.0 with attribution.