Как передать много значений в параметры запроса GET - PullRequest
0 голосов
/ 30 октября 2019

Я использовал Spring Boot и Post Man в своем проекте. В контроллере я использовал метод, чтобы все категории выглядели так:

@GetMapping(value = "/category")
@ResponseStatus(HttpStatus.OK)
public List<ReadableCategory> findAllCategories(@RequestParam(value = "filter", required = false) List<String> filter, MerchantStore store, Language language) {
    return categoryService.findCategories(store, 0, language, filter);
}

MerchanStore:

public class MerchantStore implements Auditable {

private final static String DEFAULT_STORE = "DEFAULT";

@Id
@Column(name = "MERCHANT_ID", unique = true, nullable = false)
@TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME",
        valueColumnName = "SEQ_COUNT", pkColumnValue = "STORE_SEQ_NEXT_VAL")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
@JsonProperty(

        "merchant_id")
private Integer id;

@Column(name = "STORE_NAME", nullable = true, length = 100)
@JsonProperty(value = "store_name")
private String storeName;

@Pattern(regexp = "^[a-zA-Z0-9_]*$")
@Column(name = "STORE_CODE", nullable = true, unique = true, length = 100)
@JsonProperty(value = "merchant_id")
private String code;

@Column(name = "STORE_PHONE", length = 50)
private String storePhone;

@Column(name = "STORE_ADDRESS")
private String storeAddress;

@Column(name = "STORE_CITY", length = 100)
private String storeCity;

@Column(name = "STORE_POSTAL_CODE", length = 15)
private String storePostcode;

@ManyToOne(fetch = FetchType.LAZY, targetEntity = Country.class)
@JoinColumn(name = "COUNTRY_ID", nullable = true)
private Country country;

@ManyToOne(fetch = FetchType.LAZY, targetEntity = Zone.class)
@JoinColumn(name = "ZONE_ID", nullable = true)
private Zone zone;

@Column(name = "STORE_STATE_PROV", length = 100)
private String storeStateProvince;

@Column(name = "WEIGHTUNITCODE", length = 5)
private String wightUnitCode = MeasureUnit.LB.name();

@Column(name = "SEIZEUNITCODE", length = 5)
private String seizeUnitCode = MeasureUnit.IN.name();

@Column(name = "IN_BUSINESS_SINCE")
private LocalDate inBusinessSince = LocalDate.now();

@Transient
private String dateBusinessSince;

@ManyToOne(fetch = FetchType.LAZY, targetEntity = Language.class)
@JoinColumn(name = "LANGUAGE_ID", nullable = false)
private Language defaultLanguage;

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "MERCHANT_LANGUAGE")
private List<Language> languages = new ArrayList<>();

//some thing fields and get/set methods

Language.class

@Id
@Column(name = "LANGUAGE_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

@Embedded
private AuditSection auditSection = new AuditSection();

@Column(name = "CODE", nullable = false)
private String code;

@Column(name = "SORT_ORDER")
private Integer sortOrder;

@OneToMany(mappedBy = "defaultLanguage",targetEntity = MerchantStore.class)
@ToString.Exclude
@JsonIgnoreProperties
private List<MerchantStore> storesDefaultLanguage;

@ManyToMany(mappedBy = "languages",targetEntity = MerchantStore.class,fetch = FetchType.EAGER)
@ToString.Exclude
@JsonIgnoreProperties
private List<MerchantStore> stores = new ArrayList<>();

public String getCode() {
    return code;
}

Когда я запрашиваю у почтальона внешний вид: http://localhost:8585/api/v1/id=1&storeName=2&code=3&languages=1,2,3

Это работает, но потому что в моем классе MerchanStore есть много полей, когда я запрашиваю все поля. Пример: 10 полей, мой URL очень длинный и сложный. У меня есть два вопроса:

  • Есть ли лучший способ опубликовать параметр, не помещая его в URL с помощью запроса GET (не Post Request).

  • Когда я ставлю id = 1, так как класс MerchanStore содержит идентификатор, а язык также содержит идентификатор, он устанавливает то же значение 1. Как указать конкретное значение
    MerchanStore с идентификатором и язык с идентификатором.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Вы можете использовать @ ModelAttribute .. Попробуйте с этим:

@GetMapping(value = "/category")
@ResponseStatus(HttpStatus.OK)
public List<ReadableCategory> findAllCategories(@RequestParam(value = "filter", required = false) List<String> filter, @ModelAttribute MerchantStore store, @ModelAttribute Language language) {
    return categoryService.findCategories(store, 0, language, filter);
}
0 голосов
/ 30 октября 2019

Есть ли лучший способ опубликовать параметр, не помещая его в URL, используя GET-запрос (не Post-запрос).

Нет. Использование GET с параметрами запроса означает, что ваш URL может быть отмечен закладкой . Специально для целей поиска или фильтрации, это очень удобно и полезно.

Когда я ставлю id = 1, потому что класс MerchanStore содержит id, а язык также содержит id, он устанавливает то же значение 1. КакЗначение MerchanStore с Id и Language с Id.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...