Как передать список параметров в остальном получить вызов (например, объект фильтра в электронной коммерции) - PullRequest
1 голос
/ 01 июля 2019

В моем приложении есть требование получения данных по некоторым параметрам. Я просто хочу, что лучше сделать.

Единственный способ, я могу передать список параметров как переменную пути.

Второй способ - я могу передать тело запроса, я думаю, что оно расплывчато, и я не уверен, возможно это или нет.

Вы можете найти код ниже:

@GetMapping("/cities/{cityName}/latitude/{latitude}/longitude/{longitude}/cityId/{cityId}/street/{street}")
      public ResponseEntity<ResponseContainer<CityDto>> getCityByCityNameOrLatitudeAndLongitude() {
}

Я просто хочу знать, как я могу достичь того же.

Есть еще один вопрос, у компаний, занимающихся электронной торговлей, есть критерии большого фильтра, поэтому, как они достигают.

Ответы [ 4 ]

1 голос
/ 01 июля 2019

Хотя нет жесткого и быстрого правила, но я обычно избегаю посылать тело в GET-запросе, потому что это плохой дизайн. Вам также следует обратиться к этой SO Post, которая содержит обсуждение использования body в GET-запросе. Это пост с мнением, и нет четких ДА или НЕТ, но вы поймете, как.

HTTP GET с телом запроса

Вы можете использовать параметры Path или параметры запроса в зависимости от того, что представляют эти поля.

Относительно различий или того, что использовать, когда я цитирую этот ответ , в котором упоминается, что хотя не существует жесткого правила, но обычно лучше использовать параметры, которые могут однозначно идентифицировать ресурс как параметр пути (например, id, name и т. д.) и если ваш параметр должен выполнять что-то вроде фильтрации / сортировки, например записи после 1 января 2019 года, затем перейти к параметру запроса.

Также лично в одном из моих API (который выполняет фильтрацию) я использую общий параметр запроса, в котором я передаю объект JSON в своем запросе. Так что в основном мой API должен искать объект на основе переменных / нескольких атрибутов. Например. У меня есть в моем БД, объекты, которые имеют определенные значения напряжения, тока, размера и т. Д. Таким образом, запрос может прийти с комбинацией 1 или более. Поэтому для обеспечения гибкости моего API я предоставил параметр запроса, который может принимать объект JSON.

Поэтому я делаю запрос вот так:

 {{SERVER}}/api/search?query={voltage:12V,size:10}

И в моем API я могу преобразовать этот объект json в соответствующий POJO:

@GET    
@Path("/search")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response search(@QueryParam("query") String queryParam) throws Exception                        
{       
        Myobj obj = new Gson().fromJson(queryParam, Myobj.class);           
        // rest of code
0 голосов
/ 01 июля 2019

Прежде всего, вы выставляете метод получения городов. Лучше использовать путь как /city/{somethingUnique}.

Как вы знаете, в мире есть дублирующие названия городов (например, Париж, Мельбурн).

Вместо того чтобы иметь много методов (один метод для запроса с идентификатором, другой метод для запроса с именем, другой метод для запроса с помощью lonlat, другой метод для запроса с помощью countryid) для запроса ваших городов, я предлагаю вам иметь только один метод. Это делает ваш API более гибким. Чтобы достичь этого, вы можете разработать два разных подхода:

  • Размещение критериев в качестве тела ответа.
  • Передача критериев в виде строки запроса.
0 голосов
/ 01 июля 2019

Существует третий способ, параметры запроса.

@GetMapping
public ResponseEntity<ResponseContainer<CityDto>> getCityByCityNameOrLatitudeAndLongitude(@RequestParam("cityName") String cityName, @RequestParam("latitude") String latitude, @RequestParam("longitude") String longitude){
  // Your code
}

Подробнее: 16.3.3.3 Привязка параметров запроса к параметрам метода с @ RequestParam

Параметры, использующие эту аннотацию, требуются по умолчанию, но вы можете указать, что параметр является необязательным, установив для обязательного атрибута @ RequestParam значение false (например, @RequestParam (value = "id", required = false)).

https://docs.spring.io/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#mvc-ann-requestparam

0 голосов
/ 01 июля 2019

Передавая параметры в пути, вы ограничиваете себя в расширении API.Если вы хотите расширить свой API, например, если вы хотите фильтровать с критериями как Street1 (или) Street2, то ваш путь не будет поддерживать его, и это заставит вас обновить ваш API.Лучше передавать критерии объектов в теле или параметре url.Amazon Индия проходит критерии, как показано ниже.Я выбрал мобильные устройства с критериями Производитель = Samsung или MI, Хранилище как 8 ГБ или 4 ГБ, и они просто добавили критерии в параметры запроса.

enter image description here

...