2016-04-19 3 views
0

s'il vous plaît aidez-moi, je veux envoyer des données json à une API qui utilisent l'authentification de base et je veux prendre respon de cette API. voici mon code:comment obtenir une réponse de poste dans javaws playframework 2.5

@Inject 
WSClient ws; 
public Result testWS(){ 
JsonNode task = Json.newObject() 
      .put("id", 123236) 
      .put("name", "Task ws") 
      .put("done", true); 

WSRequest request = ws.url("http://localhost:9000/json/task").setAuth("user", "password", WSAuthScheme.BASIC).post(task); 
return ok(request.tojson); 

la question est de savoir comment j'obtenir le retour de ws ci-dessus et processus à JSON? parce que ce code erreur encore. je suis utiliser playframework 2.5

Répondre

0

.post(task) résultats dans un CompletionStage<WSResponse>, de sorte que vous ne pouvez pas simplement appeler toJson dessus. Vous devez obtenir la réponse éventuelle de l'étape d'achèvement (pensez-y comme une promesse). Notez également la modification de la signature de la méthode.

import java.util.concurrent.CompletionStage; 
import javax.inject.Inject; 
import javax.inject.Singleton; 
import com.fasterxml.jackson.databind.JsonNode; 
import play.libs.Json; 
import play.libs.ws.WSAuthScheme; 
import play.libs.ws.WSClient; 
import play.libs.ws.WSResponse; 
import play.mvc.Controller; 
import play.mvc.Result; 
import scala.concurrent.ExecutionContextExecutor; 

@Singleton 
public class FooController extends Controller { 

    private final WSClient ws; 
    private final ExecutionContextExecutor exec; 

    @Inject 
    public FooController(final ExecutionContextExecutor exec, 
          final WSClient ws) { 
     this.exec = exec; 
     this.ws = ws; 
    } 

    public CompletionStage<Result> index() { 
     final JsonNode task = Json.newObject() 
            .put("id", 123236) 
            .put("name", "Task ws") 
            .put("done", true); 

     final CompletionStage<WSResponse> eventualResponse = ws.url("http://localhost:9000/json/task") 
                   .setAuth("user", 
                     "password", 
                     WSAuthScheme.BASIC) 
                   .post(task); 

     return eventualResponse.thenApplyAsync(response -> ok(response.asJson()), 
               exec); 
    } 
} 

Vérifiez la documentation pour plus de détails sur le travail avec des appels asynchrones vers des services Web.

+0

couleur "map" et "toJson". et quand je le lance. erreur d'affichage: ne peut pas trouver le symbole symbole: méthode carte ((réponse) [...] Json)) emplacement: variable eventualResponse de type java.util.concurrent.CompletionStage rizrusn

+0

Désolé, J'ai écrit ceci de mémoire en utilisant l'ancienne API 'F.Promise' dans ma tête. J'ai mis à jour la réponse avec l'appel de méthode correct. –

+0

il y a toujours une erreur, AsyncController: déclaration de méthode non valide; type de retour requis – rizrusn