Batch-HTTP-Anforderungen in Play! Framework

Ich habe die aktuellen Routen implementiert (zum Beispiel):

GET     /api/:version/:entity               my.controllers.~~~~~
GET     /api/:version/:entity/:id           my.controllers.~~~~~
POST    /api/:version/:entity               my.controllers.~~~~~
POST    /api/:version/:entity/:id           my.controllers.~~~~~
DELETE  /api/:version/:entity               my.controllers.~~~~~

POST    /api/:version/search/:entity        my.controllers.~~~~~

Und sie arbeiten wunderschön. Angenommen, ich möchte einen "Batch-Endpunkt" für dieselbe API implementieren. Es sollte ungefähr so aussehen:

POST    /api/:version/batch                 my.controllers.~~~~~

und der Körper sollte so aussehen:

[
    {
        "method": "POST",
        "call": "/api/1/customer",
        "body": {
            "name": "antonio",
            "email": "[email protected]"
        }
    },
    {
        "method": "POST",
        "call": "/api/1/customer/2",
        "body": {
            "name": "mario"
        }
    },
    {
        "method": "GET",
        "call": "/api/1/company"
    },
    {
        "method": "DELETE",
        "call": "/api/1/company/22"
    }
]

Dazu möchte ich wissen, wie ich den Play Framework Router anrufen kann, um diese Anfragen weiterzuleiten? Ich hatte vor, etwas Ähnliches zu verwenden, wie es für Unit-Tests empfohlen wird:

@Test
public void badRoute() {
  Result result = play.test.Helpers.routeAndCall(fakeRequest(GET, "/xx/Kiki"));
  assertThat(result).isNull();
} 

indem Sie in den Quellcode vonrouteAndCall()Sie finden so etwas:

 /**
 * Use the Router to determine the Action to call for this request and executes it.
 * @deprecated
 * @see #route instead
 */
@SuppressWarnings(value = "unchecked")
public static Result routeAndCall(FakeRequest fakeRequest) {
    try {
        return routeAndCall((Class<? extends play.core.Router.Routes>)FakeRequest.class.getClassLoader().loadClass("Routes"), fakeRequest);
    } catch(RuntimeException e) {
        throw e;
    } catch(Throwable t) {
        throw new RuntimeException(t);
    }
}

/**
 * Use the Router to determine the Action to call for this request and executes it.
 * @deprecated
 * @see #route instead
 */
public static Result routeAndCall(Class<? extends play.core.Router.Routes> router, FakeRequest fakeRequest) {
    try {
        play.core.Router.Routes routes = (play.core.Router.Routes)router.getClassLoader().loadClass(router.getName() + "$").getDeclaredField("MODULE$").get(null);
        if(routes.routes().isDefinedAt(fakeRequest.getWrappedRequest())) {
            return invokeHandler(routes.routes().apply(fakeRequest.getWrappedRequest()), fakeRequest);
        } else {
            return null;
        }
    } catch(RuntimeException e) {
        throw e;
    } catch(Throwable t) {
        throw new RuntimeException(t);
    }
}

Meine Frage lautet also: Gibt es eine weniger "hackige" Möglichkeit, dies mit Play zu tun (ich bin nicht dagegen, Scala und Java zu mischen, um dorthin zu gelangen), als den obigen Code zu kopieren? Ich hätte auch gerne die Möglichkeit gegeben, die Stapelaufrufe parallel oder nacheinander auszuführen ... Ich denke, nur einen zu instanziierenRoutes mit dem Klassenladeprogramm wäre das dann problematisch?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage