Комплексные RESTful GET запросы - PullRequest
0 голосов
/ 29 декабря 2010

Я понимаю, как выполнять запросы, такие как GET http://localhost:8080/rest_mysql/books/1 и извлекать с идентификатором, в данном случае «1», но предположим, что вы хотели найти книгу с 2 переменными вместо 1. Можно быть сделано через GET?

Ответы [ 4 ]

2 голосов
/ 18 февраля 2013

Мы можем говорить о 2 видах запросов

  • простые запросы, построенные сервером

    Эти запросы создаются сервером и передаются в URI, поэтому клиент не имеет к ним никакого отношения, поскольку он никогда не анализирует URI. (Клиенты REST следуют по ссылкам и используют семантические аннотации ссылок, например, отношения ссылок, чтобы решить, какую ссылку выбрать. - Ограничение HATEOAS) Таким образом, вы можете использовать любое решение, которое вам нужно, нет никаких ограничений относительно того, как построить URI. (URI должны идентифицировать ресурсы, поэтому один URI не может принадлежать нескольким ресурсам. URI отображаются на ресурсы, а не на операции, поэтому, если вы хотите иметь читаемые человеком URI, то они, вероятно, будут содержать только существительные, а не глаголы.)

  • специальные запросы, созданные клиентом

    При таком типе запросов вы должны использовать шаблоны URI и аннотировать параметры с некоторой семантикой (возможно, с помощью зависимого от приложения вокаба). Если вы выходите за пределы возможностей шаблонов URI, то вам нужен стандартный язык запросов (например, SQL) и стандартный формат описания для ограничений запросов (в настоящее время недоступен на данный момент, но может быть расширенным языком шаблонов, аннотированным семантикой RDF).

В вашем случае непонятно, чего вы хотите. Одно можно сказать наверняка, это простой запрос, созданный сервером.

  • Вы говорите об одной книге, идентифицированной с 2 ​​параметрами. В этом случае результат будет содержать представление отдельного ресурса элемента, и вы можете иметь что-то вроде этого: /books/x:1+y:2 или /books/x:1/y:2 или /books?x=1&y=2. Но идентификация книги с двумя параметрами не имеет смысла для меня.

  • Если вы хотите получить в ответ несколько книг, то речь идет о сокращении ресурса коллекции. Вы можете использовать те же самые URI, которые указаны ресурсом одного элемента: /books/x:1+y:2 или /books/x:1/y:2 или /books?x=1&y=2.

У вас может быть соглашение о том, как различать коллекции и элементы, например, /books?x=1&y=2 может означать сокращение коллекции, а /books/x:1+y:2 может означать идентификацию одного элемента. Но эта часть зависит от вас. Ofc лучше договориться об этом, потому что на сервере проще писать логику генерации и маршрутизации URI.

2 голосов
/ 29 декабря 2010

Вы можете изменить идентификатор в своем URL, чтобы разрешить список идентификаторов с разделителями:

GET /books/1+2

Это сделает ваш URL красивым и аккуратным и будет соответствовать духу REST, где URL идентифицирует ресурс. Еще одним преимуществом является то, что вы можете иметь одну привязку, которая будет обрабатывать произвольное количество идентификаторов в URL.

@GET
@Produces("application/json")
@Path("/books/{ids}")
public Books getBooks(@PathParam("ids") String ids) {

    Books books = new Books();
    for (String id: ids.split("+")) {
        books.add(bookRepository.findById(id))
    }

    return books;
}

Этот метод может обрабатывать несколько сценариев:

GET /books/1
GET /books/2
GET /books/1+2
GET /books/1+2+3
1 голос
/ 29 декабря 2010

Nevermind.Я нашел свой ответ с помощью следующего кода:

    @GET
    @Produces("application/json")
    @Path("/network/{id: [0-9]+}/{nid}")
    public User getUserByNetworkId(@PathParam("id") int id, @PathParam("nid") String networkId) {
        Query q = em.createQuery("SELECT u FROM User u WHERE u.networkId = :id AND u.networkUserId = :nid");
        q.setParameter("id", id);
        q.setParameter("nid", networkId);
        return (User) q.getSingleResult();
    }
0 голосов
/ 29 декабря 2010

Обычный подход состоит в том, чтобы передавать аргументы в качестве параметров строки запроса ... но вы могли бы вместо этого ввести их как часть URL.

например, books / search / arg1 / arg2

Лично я предпочитаю подход с использованием строки запроса.

...