我正在尝试将以下对象的列表作为查询参数传递给对我的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 ...
答案 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缓存。