/ / Comment extraire le contenu du résultat de l'objet play.mvc.Result dans l'application play? - json, playframework, playframework-2.0

Comment extraire le contenu du résultat de l'objet play.mvc.Result dans l'application de lecture? - json, playframework, playframework-2.0

en fait, je fais la redirection à partir d'un jeuapplication à une autre application de lecture, enfin je reçois une réponse en tant qu'objet de résultat. Je redirige de apllication1 vers application2. L'application 2 renverra une chaîne JSON que je dois extraire.

Comment puis-je récupérer le contenu JSON de l'objet Result?

Application1:

public static Result redirectTest(){

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

Application2:

@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());
}

Réponses:

4 pour la réponse № 1

Utilisez JavaResultExtractor, exemple:

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

Ayant un tableau d'octets, vous pouvez extraire le jeu de caractères de l'en-tête Content-Type et créer java.lang.String:

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);

Une partie du code ci-dessus a été copiée de play.test.Helpers


4 pour la réponse № 2

Cette fonction fonctionne bien pour moi .. Merci à 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 pour la réponse № 3

Vous devrez transmettre une instance de akka.stream.Materializer dans JavaResultExtractor"s getbody méthode.

Utilisez Google Guice pour l'injection au niveau du constructeur ou au niveau de la déclaration.

@Inject
Materializer materializer;

et en outre, vous pouvez convertir le résultat en chaîne ou tout autre type selon les besoins:

    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 pour la réponse № 4

Dans le contexte d'une méthode de contrôleur, vous pouvez essayer:

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();
}

Cette question SO peut également aider: JSON et Play


0 pour la réponse № 5

redirect renvoie les résultats avec le code d'erreur 303, ce qui oblige l'appelant (navigateur) à faire une autre demande à l'url donnée.
Ce que vous devez faire est en fait un proxy. Application1 doit faire une demande à Application2 et gérer la réponse.
Jouer ont très agréable API de service Web qui permettent de le faire facilement.


0 pour la réponse № 6

D'abord j'écris cette méthode scala pour convertir Enumerator [Array [Byte]] en Future [Array [Byte]]:

class EnumeratorHelper {

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

}

Ensuite, convertissez Future retourné en promesse et obtenez enfin la valeur de la promesse:

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")));

});