récupérer JsonObject POST avec jersey
J'ai quelques problèmes dans ma demande, j'envoie une requête POST, mais je ne peut pas récupérer la JsonObject dans mon serveur, voici le code à envoyer:
String quo = "{\"network\": {\"label\": \"new net 111\",\"cidr\": \"10.20.105.0/24\"}}";
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
JsonParser json = new JsonParser();
JsonObject jo = (JsonObject)json.parse(quo);
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
WebTarget target = client.target("http://localhost:7999/jersey/rest/network/"+tenant_id);
Response oj = target.request().accept(MediaType.APPLICATION_JSON)
.header("X-Auth-Token", token)
.post(Entity.json(gson.toJson(jo)));
Essayer de le récupérer avec:
@POST
@Produces(MediaType.APPLICATION_JSON)
@Path("/{tenant_id}")
public String createNetwork(@HeaderParam(value = "X-Auth-Token") String authToken,
@PathParam(value = "tenant_id") String tenant_id,
JsonObject network){
Response response = client.target(NOVA_ENDPOINT+tenant_id)
.request(MediaType.APPLICATION_JSON)
.header("X-Auth-Token", authToken)
.post(Entity.json(gson.toJson(network)));
System.out.println("Hello");
String responseJson = response.readEntity(String.class);
JsonObject réseau semble être vide, en fait il n'a pas d'exécuter la méthode ("Bonjour n'est pas imprimé"), le message d'erreur que j'obtiens est "Invalide du corps de la requête" (parce que le JsonObject est vide je pense)..
Quel est le problème avec mon code?
Ok, j'ai compris que le problème est lié à Json de manutention tels que je suis en utilisant Gson. C'est mon code améliorée (version simplifiée) à la suite d'utilisateurs suggestion, mais j'ai toujours des problèmes..
Côté Client:
package openstack;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.net.URI;
public class Post {
public static HttpServer startServer() {
final ResourceConfig resourceConfig = new ResourceConfig()
.packages("openstack")
.register(GsonMessageBodyHandler.class);
return GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:7999/jersey/rest"), resourceConfig);
}
public static void main(String[] args) {
String quo = "{\"keypair\": {\"name\": \"MyKey\"}}";
HttpServer server = startServer();
Client client = ClientBuilder.newClient();
client.register(GsonMessageBodyHandler.class);
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
JsonParser json = new JsonParser();
JsonObject jo = (JsonObject)json.parse(quo);
WebTarget target = client.target("http://localhost:7999/jersey/rest/test/prova");
System.out.println(jo);
Response oj = target.request().post(Entity.json(jo));
String responseString = oj.readEntity(String.class);
System.out.println(responseString);
}
}
Côté Serveur:
package openstack;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@Path("/test")
public class Test {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
Parliament parliament = new Parliament();
JsonParser json = new JsonParser();
private final Client client;
public Test() {
client = ClientBuilder.newClient().register(GsonMessageBodyHandler.class);
}
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/prova")
public Response mymethod(JsonObject keypairsob){
return Response.ok(keypairsob).build();
}
}
J'ai créé un GsonMessageBodyHandler.java dans mon colis avec le code proposé ci-dessous par l'utilisateur peeskillet. Ajouté jersey-container-grizzly2-http.jar pour ma web-inf/lib (je ne sais pas comment faire pour la bonne utilisation de Maven), mais ne fonctionne toujours pas.. ce qui me manque?
Avez-vous d'ajouter le JSON-P module?
En fait, je n'ai pas parce que je suis en utilisant Gson.. est-il un problème?
Oui. Lorsque vous envoyez la demande, il est sérialisé JSON forme. Mais qui va désérialiser retour à JsonObject? Ce qui est fait dans les coulisses par un
MessageBodyReader
de mise en œuvre qui prend en charge JSON-P. le lecteur est fourni dans le JSON-P module. Je ne suis Pas familier avec Gson, donc je ne sais pas si c' JsonObject
est un Gson objet ou un JSON-P de l'objet. Si c'est Gson objet, vous pouvez prendre un coup d'oeil à MessageBodyReader/Writer
implemntation pour Gson. Vous devez enregistrer ce fournisseur à la fois avec le client et le serveur. Si c'est du JSON-P, le JSON-P module s'inscrire lui-mêmeDésolé, j'ai oublié le lien pour la mise en œuvre. c'est Ici
OriginalL'auteur rok | 2014-11-28
Vous devez vous connecter pour publier un commentaire.
Pour les convertir en JSON pour un type Java, il est nécessaire d'avoir pour une
MessageBodyReader
et unMessageBodyWriter
mise en œuvre pour effectuer la conversion depuis et vers. Puisque vous utilisezJsonObject
qui est un GSON type, vous pouvez voir cette mise en œuvre. Il y a un problème avec la mise en œuvre même si, comme lereadFrom
méthode ne compile pas avec Jersey 2. Voici la version fixePuis nous avons juste besoin de s'inscrire à la fois au client et à l'application. Je suis à l'aide d'un test autonome, où vous pouvez voir la configuration ici
Ici est la classe de ressources que j'ai utilisé pour le test
Voici le test complet, qui nécessite cette dépendance maven
Tous le test n'est d'envoyer le
JsonObject
. Bien qu'il n'est pas visible de la conversion en JSON, dans mon code, il se passe en coulisses par leGsonMessageBodyHandler
. Si vous regardez laGsonResource
classe, vous pouvez voir les méthodes ne rien faire d'autre que d'envoyer lesJsonObject
. Dans le client de test, j'ai lu la réponse à la Chaîne, et vous pouvez voir le résultat le même que ce qui a envoyé dans la demande initiale.OriginalL'auteur Paul Samsotha
Il y a un moyen simple d'obtenir la JsonObject dans com.google.gson.JsonObject type à l'aide d'une requête post.
Je suis en supposant que toutes les dépendances pour com.google.gson , jersey et jax-rs sont déjà ajoutés.
Du côté serveur, vous devez disposez d'un code similaire à ci-dessous :
Le code ci-dessus a un point de terminaison rest défini avec chemin d'accès /api/pudding et c'est d'accepter le Corps de la Requête en tant que Chaîne de caractères. Une fois que vous recevez le Json comme une chaîne de caractères sur le côté serveur, com.google.gson.JsonParser peut être utilisé pour convertir en la com.google.gson.JsonObject directement et cela peut être utilisé dans votre programme.
De faire une demande sur le côté serveur vous demande post devrait ressembler à ceci :
OriginalL'auteur ASHISH DHIMAN
Avez-vous eu une JSON demandes analysée avec succès? Il se pourrait que vous devez activer la prise en charge de JSON en Jersey:
https://jersey.java.net/documentation/1.18/json.html
Sinon, c'est peut-être simplement à défaut, sur votre demande, à son tour le corps du message dans un JsonObject ici:
Est-il possible, c'est d'appeler un de vos autres @Path méthodes à la place? Parfois, la résolution de chemins peut être un peu contre-intuitif..
L'appel de mon autre chemin de produire le même
Avez-vous un @Consomme de la classe qui est incompatible avec json? Peut-être que vous pourriez publier l'ensemble de la classe?
il ne fonctionne pas avec les consomme trop.. je pense que quelque chose est liée à Json de gestion, parce que l'aide de la Chaîne au lieu de cela fonctionne parfaitement.. je vais poster l'ensemble de la classe bientôt de toute façon..
OriginalL'auteur user384842