簡體   English   中英

REST / Java中的良好做法

[英]Good practices in REST / Java

我目前正在嘗試獲得REST方面的技能,尤其是“良好的Rest”,超媒體及其附帶的所有良好實踐方面的技能。

為此,我被要求開發一個包含我選擇的數據的REST服務器原型,並實現在此之后的真實項目中必須使用的所有功能。 所以我用Spring Boot和Jackson制作了一個服務器來處理json。

我的數據架構與此接近:我有一個LaunchVehicle集合(我喜歡space = D),例如Ariane V,Falcon 9等。我可以完美地檢索JSON對象

{ "name":"Ariane V","country":"Europe","firstFlight":null,"GTO_Payload":1.0,"LEO_Payload":2.3,"weight":136.0 } 

問題是,我想在“ LaunchVehicle”中添加一個“空間代理”字段,該字段將是一個包含一些Strings和Floats的對象。 但是,當客戶端檢索LaunchVehicle時,我不希望它檢索完整的SpaceAgency對象,僅檢索示例名稱。 從這里,他將能夠通過超媒體鏈接來跟蹤到航天局的鏈接,該鏈接將包含在該響應中。

我怎樣才能做到這一點 ? 現在,我只能將我的完整的LaunchVehicle對象以及SpaceAgency對象及其所有字段發送給客戶端。 有沒有做我想要的注釋? 謝謝 ;)

public class LaunchVehicle {


    private String name;
    private String country;
    private Date firstFlight;
    private Map<String, Float> characteristics;
    private SpaceAgency spaceAgency;

    @JsonCreator
    constructor...

    @JsonProperty(required=false)
    getters and setters...

}

非常感謝,如果我不夠精確或可以理解,請不要猶豫。

在類級別嘗試@JsonIgnoreProperties批注。 那應該為您提供所需的功能。

否則,您總是可以使用某種DTO對象來創建響應模型,並且在API層中只有要使用的字段。

我寧願為您的API層使用適當的DTO / ApiModel,而不要使用帶有JSON注釋的完整域對象。

如果您的SpaceAgency類僅定義了需要反序列化的屬性,那么Jackson只會反序列化那些屬性。 它將忘記未映射的屬性。

您可以為此使用Gson API

JsonParser parser = new JsonParser();
JsonObject obj = parser.parse(spaceAgency).getAsJsonObject();
String agencyName = obj.get("agencyName").getAsString();

嘗試jax-ws-rs! 它是Java中的標准REST實現。

Oracle文檔

Mkyong的很好的教程

我認為您應該將航天局作為超鏈接引用。

因此,JSON如下所示:

{ "name":"Ariane V",
  "country":"Europe",
  < other fields omitted >
  "_links": {
    "agency": { "href": "agencies/ESA" },
   < other links omitted >
  }
}

為此,您需要在數據傳輸對象中指定鏈接。 不要將其引用為該類型的實際對象,否則將意味着填充該對象,即使客戶端不要求它也是如此。

如何實現這一目標取決於您所使用的技術。 在澤西島

 public class LaunchVehicle {
     ...
     @InjectLink(resource=AgencyResource.class)
     URI agencyLink;
     ...
 }

https://jersey.java.net/documentation/latest/declarative-linking.html

這樣的鏈接就是“真正的” REST的全部目的。 但是請注意,許多現實世界的解決方案都聲稱在不實際使用超鏈接的情況下執行REST。 更具欺騙性的解決方案是在JSON中具有String agencyId字段,可以將其放入URL模板中以獲取代理商詳細信息。

暫無
暫無

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

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