【问题标题】:How to pass a lot values into GET request parameters如何将很多值传递给 GET 请求参数
【发布时间】:2020-02-25 07:57:42
【问题描述】:

我在我的项目中使用了 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

语言类

@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 很长很复杂。 我有两个问题:

  • 有没有更好的方法来发布参数而不把它放在 使用 GET 请求(不是发布请求)的 url。

  • 当我设置 id=1 时,因为 MerchanStore 类包含 id 和语言 还包含id,它把相同的值1。如何具体值
    带有 ID 的 MerchanStore 和带有 ID 的语言。

【问题讨论】:

    标签: java spring-boot spring-mvc postman


    【解决方案1】:

    有没有更好的方法来发布参数而不使用 GET 请求(而不是发布请求)将其放在 url 上。

    没有。使用带有请求参数的 GET 表示您的 URL 可以被加入书签。特别是对于搜索或过滤目的,非常方便和有用。

    当我设置 id=1 时,因为 MerchanStore 类包含 id 并且语言也包含 id,所以它设置相同的值 1。如何具体值 带有 ID 的 MerchanStore 和带有 ID 的语言。

    我不知道这个,也许你可以将它作为一个新问题发布。

    【讨论】:

    • 谢谢。但正如我在帖子中所写,我的对象有很多领域。当我把所有的东西都放在网址里时,它很长。当我知道时,url 限制大小 url ?是最好的方法吗?将内容发布到标题或类似的内容
    • @trungtbdn11 是的,URL 有最大长度,你可以参考What is the maximum length of a URL in different browsers?。但是大多数流行的 Web AP 也这样做了,例如 JIRA,他们甚至使用 JQL 通过 GET 方法实现高级搜索。
    【解决方案2】:

    您可以使用 @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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多