実際、私は1つのプレイからリダイレクトを行っています別の再生アプリケーションへのアプリケーション、最後にResultオブジェクトとして応答を受け取ります。以下は2つのアプリケーションでのアクションです。 apllication1からapplication2にリダイレクトしています。アプリケーション2は、抽出する必要があるJSON文字列を返します。
ResultオブジェクトからJSONコンテンツを取得するにはどうすればよいですか?
アプリケーション1:
public static Result redirectTest(){
Result result = redirect("http://ipaddress:9000/authenticate");
/*** here I would like to extract JSON string from result***/
return result;
}
アプリケーション2:
@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());
}
回答:
回答№1は4JavaResultExtractorを使用します。例:
Result result = ...;
byte[] body = JavaResultExtractor.getBody(result, 0L);
バイト配列があるので、Content-Typeヘッダーから文字セットを抽出して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);
上記のコードの一部はからコピーされました play.test.Helpers
回答№2については4
この機能は私にとってはうまく機能します。MonCalamariのおかげで
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;
}
}
答え№3の2
のインスタンスを渡す必要があります akka.stream.Materializer に JavaResultExtractor"s ゲットボディ 方法。
Google Guiceを使用して、コンストラクタレベルまたは宣言レベルで注入します。
@Inject
Materializer materializer;
さらに、必要に応じて結果を文字列またはその他のタイプに変換できます。
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.
回答№4の場合は0
コントローラメソッドのコンテキストでは、次のことを試すことができます。
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();
}
このSOの質問も役立ちます。 JSONとPlay
回答№5の場合は0
redirect
エラーコード303で結果を返します。これにより、呼び出し元(ブラウザ)は、指定されたURLに対して別の要求を実行します。
あなたがする必要があるのは、実際にはプロキシです。 Application1はApplication2に要求を出し、その応答を処理する必要があります。
プレイはとても素敵です WebサービスAPI これを簡単に行うことができます。
答え№6の場合は0
まず、このスカラメソッドを記述して、Enumerator [Array [Byte]]をFuture [Array [Byte]]に変換します。
class EnumeratorHelper {
def getEnumeratorFuture(body: Enumerator[Array[Byte]]) ={
Iteratee.flatten(body |>> Iteratee.consume[Array[Byte]]()).run
}
}
次に、返されたFutureをPromiseに変換し、最後にpromiseの値を取得します。
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")));
});