簡體   English   中英

Spring Rest Controller: Accept single object and array under one URL

[英]Spring Rest Controller: Accept single object and array under one URL

假設有一個 REST Controller 的端點接受一個 object 在體內:

@PostMapping("/ExampleObjects")
void mapping(@RequestBody ExampleObject object){ ....

如果要添加在同一端點下接受數組的功能,如下所示:

@PostMapping("/ExampleObjects")
void mapping(@RequestBody ExampleObject[] objects){ ....

有沒有辦法用給定的設計實現新功能而不破壞現有用戶?

將第一個端點稱為“/ExampleObject”怎么樣,因為它看起來是單數的?

讓您的 API 端點盡可能簡單、盡可能一致(在單個 API 中的不同端點之間)和盡可能容錯是一種很好的做法。

在任何情況下,您都希望使用通用List<ExampleObject>而不是數組。

您可以只實現該方法的列表版本,使用僅包含單個實例的列表調用該方法。 您需要稍微考慮一下等式的一致性部分。 您將在 API 中實現哪些不同的端點。 這個解決方案適合大多數用例嗎?

Go 的解決方案對您的 API 用戶的意外影響最小。

目前,像 Jackson 之類的東西正在自動為您解析從 HTTP 請求正文到ExampleObject

您可以在代碼中進行解析並在解析期間決定它是ExampleObject還是ExampleObject[]的實例。 因此,您將有一個具有此簽名的方法:

@PostMapping("/ExampleObjects")
void mapping(@RequestBody String objectOrArray){ 
    // code to parse String into ExampleObject or ExampleObject[] ...

這應該可以解決您的問題,但更好的 API 設計將具有 2 個不同的端點/URL。

那應該對你有幫助。

應用程序屬性:

spring.jackson.deserialization.accept-single-value-as-array=true

controller:

@PostMapping("/ExampleObjects")
void mapping(@RequestBody List<ExampleObject> objects){ ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM