/ / Wie extrahiere ich Ergebnisinhalte aus dem play.mvc.Result-Objekt in der Play-Anwendung? - json, playframework, playframework-2.0

Wie extrahiere ich Ergebnisinhalte aus dem play.mvc.Result-Objekt in der Play-Anwendung? - json, playframework, playframework-2.0

Eigentlich mache ich eine Umleitung von einem SpielAnwendung auf eine andere Spielanwendung, schließlich erhalte ich eine Antwort als Ergebnisobjekt. Unten ist die Aktion in zwei Anwendungen. Ich leite von Anwendung1 zu Anwendung2 um. Anwendung 2 gibt eine JSON-Zeichenfolge zurück, die ich extrahieren muss.

Wie kann ich JSON-Inhalte vom Ergebnisobjekt abrufen?

Anwendung1:

public static Result redirectTest(){

Result result =  redirect("http://ipaddress:9000/authenticate");
/*** here I would like to extract JSON string from result***/
return result;
}

Anwendung2:

@SecuredAction
public static Result index() {
Map<String, String> response = new HashMap<String, String>();
DemoUser user = (DemoUser) ctx().args.get(SecureSocial.USER_KEY);

for(BasicProfile basicProfile: user.identities){
response.put("name", basicProfile.firstName().get());
response.put("emailId", basicProfile.email().get());
response.put("providerId", basicProfile.providerId());
response.put("avatarurl", basicProfile.avatarUrl().get());
}

return ok(new JSONObject(response).toString());
}

Antworten:

4 für die Antwort № 1

Verwenden Sie JavaResultExtractor, Beispiel:

Result result = ...;
byte[] body = JavaResultExtractor.getBody(result, 0L);

Mit einem Byte-Array können Sie einen Zeichensatz aus dem Content-Type-Header extrahieren und java.lang.String erstellen:

String header = JavaResultExtractor.getHeaders(result).get("Content-Type");
String charset = "utf-8";
if(header != null && header.contains("; charset=")){
charset = header.substring(header.indexOf("; charset=") + 10, header.length()).trim();
}
String bodyStr = new String(body, charset);
JsonNode bodyJson = Json.parse(bodyStr);

Ein Teil des obigen Codes wurde von kopiert play.test.Helpers


4 für die Antwort № 2

Diese Funktion funktioniert gut für mich. Danke an Mon Calamari

public static JsonNode resultToJsonNode(Result result) {

byte[] body = JavaResultExtractor.getBody(result, 0L);

ObjectMapper om = new ObjectMapper();
final ObjectReader reader = om.reader();
JsonNode newNode = null;
try {
newNode = reader.readTree(new ByteArrayInputStream(body));
Logger.info("Result Body in JsonNode:" + newNode.toString());
} catch (JsonProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return newNode;
}

}


2 für die Antwort № 3

Sie müssen eine Instanz von übergeben akka.stream.Materializer in JavaResultExtractor"s getbody Methode.

Verwenden Sie Google Guice zum Injizieren auf Konstruktor- oder Deklarationsebene.

@Inject
Materializer materializer;

und Weiter können Sie das Ergebnis nach Bedarf in einen String oder einen anderen Typ konvertieren:

    Result result = getResult(); // calling some method returning result
ByteString body = JavaResultExtractor.getBody(result, 1, materializer);
String stringBody = body.utf8String(); // get body as String.
JsonNode jsonNodeBody = play.libs.Json.parse(stringBody); // get body as JsonNode.

0 für die Antwort № 4

Im Kontext einer Controller-Methode können Sie Folgendes versuchen:

import play.libs.Json;
import play.mvc.Result;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.node.ObjectNode;
...
public static Result redirectTest(){
ObjectNode body = (ObjectNode) request().body().asJson();
String providerId = body.get("providerId").asText();
}

Diese SO-Frage kann auch helfen: JSON und Play


0 für die Antwort № 5

redirect Ergebnisse mit Fehlercode 303 zurückgeben, die den Anrufer (Browser) veranlassen, eine weitere Anfrage an die angegebene URL zu stellen.
Was Sie tun müssen, ist tatsächlich Proxy. Anwendung1 sollte eine Anfrage an Anwendung2 stellen und die Antwort verarbeiten.
Spiel haben sehr schön Webdienst-API die es leicht machen, dies zu tun.


0 für die Antwort № 6

Zuerst schreibe ich diese Scala-Methode, um Enumerator [Array [Byte]] in Future [Array [Byte]] zu konvertieren:

class EnumeratorHelper {

def getEnumeratorFuture(body: Enumerator[Array[Byte]]) ={
Iteratee.flatten(body |>> Iteratee.consume[Array[Byte]]()).run
}

}

Konvertieren Sie dann die zurückgegebene Zukunft in Versprechen und erhalten Sie schließlich den Versprechen-Wert:

final F.Promise<Result> finalResultPromise = delegate.call(ctx);
finalResultPromise.onRedeem(result -> {
F.Promise<byte[]> requestBodyPromise = F.Promise.wrap(new EnumeratorHelper().getEnumeratorFuture(result.toScala().body()));

requestBodyPromise.onRedeem(bodyByte -> handleBody(new String(bodyByte, "utf-8")));

});