it-swarm.com.de

Spezifische Felder für die Federspeichersteuerung

Ich habe mir die beste Methode zum Entwurf einer JSON-API mit Spring MVC angesehen. Wie wir alle wissen, ist IO teuer, und daher möchte ich nicht, dass der Client mehrere API-Aufrufe vornimmt, um das zu bekommen, was er benötigt. Zur gleichen Zeit möchte ich jedoch nicht unbedingt das Spülbecken zurückgeben.

Als Beispiel habe ich an einer Spiel-API gearbeitet, die der von IMDB ähnelt, aber stattdessen für Videospiele.

Wenn ich alles zurückschicke, was mit Game zusammenhängt, würde es ungefähr so ​​aussehen.

/ api/game/1

{
    "id": 1,
    "title": "Call of Duty Advanced Warfare",
    "release_date": "2014-11-24",
    "publishers": [
        {
            "id": 1,
            "name": "Activision"
        }
    ],
    "developers": [
        {
            "id": 1,
            "name": "Sledge Hammer"
        }
    ],
    "platforms": [
        {
            "id": 1,
            "name": "Xbox One",
            "manufactorer": "Microsoft",
            "release_date": "2013-11-11"
        },
        {
            "id": 2,
            "name": "PlayStation 4",
            "manufactorer": "Sony",
            "release_date": "2013-11-18"
        },
        {
            "id": 3,
            "name": "Xbox 360",
            "manufactorer": "Microsoft",
            "release_date": "2005-11-12"
        }
    ],
    "esrbRating": {
        "id": 1,
        "code": "T",
        "name": "Teen",
        "description": "Content is generally suitable for ages 13 and up. May contain violence, suggestive themes, crude humor, minimal blood, simulated gambling and/or infrequent use of strong language."
    },
    "reviews": [
        {
            "id": 1,
            "user_id": 111,
            "rating": 4.5,
            "description": "This game is awesome"
        }
    ]
}

Sie benötigen jedoch möglicherweise nicht alle diese Informationen, können dies jedoch wiederum tun. Anrufe für alles zu tätigen scheint eine schlechte Idee aus E/A und Leistung zu sein.

Ich dachte darüber nach, indem ich in den Anforderungen Include-Parameter spezifizierte. 

Wenn Sie beispielsweise keine Include-Werte angegeben haben, erhalten Sie Folgendes:.

{
    "id": 1,
    "title": "Call of Duty Advanced Warfare",
    "release_date": "2014-11-24"
}

Sie möchten jedoch, dass alle Informationen, die Ihre Anforderungen betreffen, in etwa so aussehen.

/api/game/1?include=publishers,developers,platforms,reviews,esrbRating

Auf diese Weise kann der Client festlegen, wie viele Informationen er wünscht. Ich bin jedoch irgendwie der beste Weg, dies mit Spring MVC zu implementieren.

Ich denke der Controller würde so aussehen.

public @ResponseBody Game getGame(@PathVariable("id") long id, 
    @RequestParam(value = "include", required = false) String include)) {

        // check which include params are present

        // then someone do the filtering?
}

Ich bin nicht sicher, wie Sie das Game-Objekt optional serialisieren würden. Ist das überhaupt möglich? Wie gehen Sie in Spring MVC am besten vor?

Zu Ihrer Information, ich benutze Spring Boot, der Jackson für die Serialisierung enthält. 

14
greyfox

Anstatt ein Game-Objekt zurückzugeben, können Sie es als Map<String, Object> serialisieren, wobei die Map-Schlüssel die Attributnamen darstellen. So können Sie die Werte basierend auf dem Parameter include zu Ihrer Karte hinzufügen.

@ResponseBody
public Map<String, Object> getGame(@PathVariable("id") long id, String include) {

    Game game = service.loadGame(id);
    // check the `include` parameter and create a map containing only the required attributes
    Map<String, Object> gameMap = service.convertGameToMap(game, include);

    return gameMap;

}

Wenn Sie beispielsweise einen Map<String, Object> wie folgt haben:

gameMap.put("id", game.getId());
gameMap.put("title", game.getTitle());
gameMap.put("publishers", game.getPublishers());

Es würde folgendermaßen serialisiert:

{
  "id": 1,
  "title": "Call of Duty Advanced Warfare",
  "publishers": [
    {
        "id": 1,
        "name": "Activision"
    }
  ]
}
11

Ich bin mir bewusst, dass meine Antwort erst spät kommt: Ich würde mir Projections empfehlen. 

Was Sie fragen, ist, worum es bei den Projektionen geht.

Da Sie sich nach Spring erkundigen, versuche ich es hier: https://docs.spring.io/spring-data/rest/docs/current/reference/html/#projections- Auszüge

1
yaccob