2014-10-10 74 views
2

實際上我正在從一個play應用程序重定向到另一個play應用程序,最後我收到響應作爲Result對象..下面是兩個應用程序中的操作。我正在從apllication1重定向到application2。應用程序2將返回JSON字符串,我需要提取。如何在play應用程序中從play.mvc.Result對象中提取結果內容?

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

回答

4

使用JavaResultExtractor,例如:

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

有一個字節數組,你可以從內容 - 提取字符集類型頭,並創建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

+0

JavaResultExtractor.getBody(結果,0L)給出超時即使我把它從0更改爲100K – 2016-09-14 11:58:39

+0

想知道爲什麼不要使用play.test.Helpers.contentAsString(result)? – Fahad 2017-03-28 17:16:10

+0

助手類具有測試範圍。 – 2017-03-28 20:56:02

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 and Play

0

redirect返回錯誤代碼爲303的結果,這會導致調用方(瀏覽器)執行另一個請求到給定的網址。
你需要做的是實際的代理。 Application1應向Application2發出請求,並處理響應。
播放有非常好的Web Service API它可以很容易地做到這一點。

4

此功能工作正常,我..感謝蒙卡拉馬裏

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

}

+0

JavaResultExtractor.getBody正在給出超​​時錯誤,即使我將值從0增加到100k。 – 2016-09-14 11:22:40

0

首先,我寫這篇文章的Scala方法來轉換枚舉[數組[字節]到未來[數組[字節] ]:

class EnumeratorHelper { 

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

} 

然後轉換回到未來的承諾,最後得到承諾值:

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

}); 
2

你需要通過akka.stream.Materializer的實例爲JavaResultExtractorgetbody方法。

使用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. 
+0

經過一天半的搜索之後,這是* only *的地方,我發現這個解決方案用於在Play-2.5上下文中「創建」「Materializer」。這應該在從Play 2.4到Play 2.5的遷移指南中提到。 – 2018-01-04 11:00:51

相關問題