web-dev-qa-db-fra.com

Comment envoyer et recevoir des données JSON d'un service Web reposant à l'aide de l'API Jersey

@Path("/hello")
public class Hello {

    @POST
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public JSONObject sayPlainTextHello(@PathParam("id")JSONObject inputJsonObj) {

        String input = (String) inputJsonObj.get("input");
        String output="The input you sent is :"+input;
        JSONObject outputJsonObj = new JSONObject();
        outputJsonObj.put("output", output);

        return outputJsonObj;
    }
} 

Ceci est mon service web (j'utilise l'API Jersey). Mais je ne pouvais pas trouver un moyen d'appeler cette méthode à partir d'un client de repos Java pour envoyer et recevoir les données JSON. J'ai essayé la façon suivante d'écrire le client

ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource service = client.resource(getBaseURI());
JSONObject inputJsonObj = new JSONObject();
inputJsonObj.put("input", "Value");
System.out.println(service.path("rest").path("hello").accept(MediaType.APPLICATION_JSON).entity(inputJsonObj).post(JSONObject.class,JSONObject.class));

Mais cela montre l'erreur suivante 

Exception in thread "main" com.Sun.jersey.api.client.ClientHandlerException: com.Sun.jersey.api.client.ClientHandlerException: A message body writer for Java type, class Java.lang.Class, and MIME media type, application/octet-stream, was not found
15
Ayan Biswas

Votre utilisation de @PathParam est incorrecte. Il ne suit pas ces exigences comme indiqué dans le document javadoc ici . Je crois que vous voulez simplement POST l'entité JSON. Vous pouvez résoudre ce problème dans votre méthode de ressource pour accepter l'entité JSON.

@Path("/hello")
public class Hello {

  @POST
  @Produces(MediaType.APPLICATION_JSON)
  @Consumes(MediaType.APPLICATION_JSON)
  public JSONObject sayPlainTextHello(JSONObject inputJsonObj) throws Exception {

    String input = (String) inputJsonObj.get("input");
    String output = "The input you sent is :" + input;
    JSONObject outputJsonObj = new JSONObject();
    outputJsonObj.put("output", output);

    return outputJsonObj;
  }
}

Et, votre code client devrait ressembler à ceci:

  ClientConfig config = new DefaultClientConfig();
  Client client = Client.create(config);
  client.addFilter(new LoggingFilter());
  WebResource service = client.resource(getBaseURI());
  JSONObject inputJsonObj = new JSONObject();
  inputJsonObj.put("input", "Value");
  System.out.println(service.path("rest").path("hello").accept(MediaType.APPLICATION_JSON).post(JSONObject.class, inputJsonObj));
20
Arul Dhesiaseelan

Pour moi, le paramètre (JSONObject inputJsonObj) ne fonctionnait pas. J'utilise le maillot 2. * C'est pourquoi je pense que c'est la 

Java (Jax-rs) et manière angulaire

J'espère que cela sera utile à quelqu'un qui utilise Java Rest et AngularJS comme moi.

@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.APPLICATION_JSON)
public Map<String, String> methodName(String data) throws Exception {
    JSONObject recoData = new JSONObject(data);
    //Do whatever with json object
}

Côté client, j'ai utilisé AngularJS

factory.update = function () {
data = {user:'Shreedhar Bhat',address:[{houseNo:105},{city:'Bengaluru'}]}
        data= JSON.stringify(data);//Convert object to string
        var d = $q.defer();
        $http({
            method: 'POST',
            url: 'REST/webApp/update',
            headers: {'Content-Type': 'text/plain'},
            data:data
        })
        .success(function (response) {
            d.resolve(response);
        })
        .error(function (response) {
            d.reject(response);
        });

        return d.promise;
    };
2
shreedhar bhat

Le problème ci-dessus peut être résolu en ajoutant les dépendances suivantes dans votre projet, car j'étais confronté au même problème. Pour une réponse plus détaillée à cette solution, veuillez consulter le lien SEVERE: MessageBodyWriter introuvable pour le type de média = application/xml type = class Java.util.HashMap

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.0</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.2</version>
    </dependency>   


    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25</version>
    </dependency>
0
Prakhar Agrawal