[英]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();
我認為您應該將航天局作為超鏈接引用。
因此,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.