在GET调用查询参数中构造json数据

时间:2018-03-28 00:07:31

标签: json rest web service

我正在尝试将以下对象的列表作为查询参数传递给对我的Java服务的GET调用:

GET endpoint.com/entity?id1=123456&country1=US&locale1=en_us&id2=...

作为网址,这就像

s=["How are you. Don't wait for me",  "this is all fine"]

将此作为服务处理的最佳方法是什么?如果我传递这些对象中的15个,是否有一种简洁的方法来接受这些参数并将它们转换为服务器端的Java对象?

我想像这样的URL,服务控制器会有很多@QueryParams ...

2 个答案:

答案 0 :(得分:2)

将整个数据集创建为JSON数组,例如

[
  {
    "id": "123456",
    "country": "US",
    "locale": "en_us"
  },
  {
    "id": "7890",
    "country": "UK",
    "locale": "en_gb"
 }
]

base64对其进行编码并将其作为参数传递,例如

获取endpoint.com/entity?set=BASE64_ENCODED_DATASET

然后在服务器上解码并使用Spring Boot将JSON数组解析为Java对象。

根据有效的URL大小注释(虽然2000可用),您可以将数据放在标题中,取决于服务器,可以是8-16kb。一次获取多个资源将在设计的某个地方引起妥协。

由于Base64可以包含+/=,您也可以对其进行网址编码,尽管在SAML中使用此技术时我还没有发现需要这样做。

另一种方法是在通过国家/地区特定ID进行搜索时妥协:

GET endpoint.com/entity/{country}/{locale}/{id_csv}

所以你会这样搜索:

GET endpoint.com/entity/US/en_us/123456,0349,23421

你的后端句柄(如果使用Spring)作为@PathParam{country}的{​​{1}},它会拆分{locale}以获取该国家/地区组合的ID列表。

要获取其他国家/地区搜索:

{id_csv}

网址要小得多,但您无法一次性查询整个数据集,因为您每次都需要根据国家/地区进行查询。

答案 1 :(得分:0)

看起来您的GET从服务器获取多个资源。我考虑根据GET请求从服务器重构GET 1资源。如果这会导致性能问题,请考虑使用HTTP缓存。