Passing an object to a REST Web Service using Jersey

前端 未结 5 738
无人共我
无人共我 2020-12-17 04:04

I have a simple WS that is a @PUT and takes in an object

@Path(\"test\")
public class Test {

    @PUT
    @Path(\"{nid}\"}
    @Consumes(\"appl         


        
相关标签:
5条回答
  • 2020-12-17 04:31

    I think the usage of the @PathParam is not correct here. A @PathParam is can basically be a String (see its javadoc for more info).

    You can

    1. use the @PathParam as a String parameter or
    2. don't define WolRequest as a @PathParam.

    The first approach:

    @Path("test")
    public class Test {
    
        @PUT
        @Path("{nid}")
        @Consumes("application/xml")
        @Produces({"application/xml", "application/json"})
        public WolResponse callWol(@PathParam("nid") String nid) {
            WolResponse response = new WolResponse();
            response.setResult(result);
            response.setMessage(nid);
    
            return response;
        }
    

    This will accept urls like: "text/12", 12 will then be the String nid. It doesn't look like this will help what you are trying to do.

    The second approach:

    @Path("test")
    public class Test {
    
        @PUT
        @Consumes("application/xml")
        @Produces({"application/xml", "application/json"})
        public WolResponse callWol(WolRequest nid) {
            WolResponse response = new WolResponse();
            response.setResult(result);
            response.setMessage(nid.getId());
    
            return response;
        }
    

    Your client code can be like you specified, only the url for PUT is: "test". Perhaps you need a combination of both one @PathParam for your id and one "normal" parameter to get your request data.

    0 讨论(0)
  • 2020-12-17 04:31

    Try this it will work

    Server Side:

    @PUT
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    public String addRecord(CustomClass mCustomClass)
    {
        ///
        ///
        ///
        return "Added successfully : "+CustomClass.getName();
    
    }// addRecord
    

    Client Side:

    public static void main(String[] args)
    {
        ///
        ///
        ///
        CustomClass mCustomClass = new CustomClass();
        Client client = ClientBuilder.newClient();
        String strResult = client.target(REST_SERVICE_URL).request(MediaType.APPLICATION_XML).put(Entity.xml(mCustomClass), String.class);
    }
    
    0 讨论(0)
  • 2020-12-17 04:32

    I had the same problem I solved in 3 Steps with Jackson in Netbeans/Glashfish btw.

    1)Requirements :

    some of the Jars I used :

     commons-codec-1.10.jar
     commons-logging-1.2.jar
     log4j-1.2.17.jar
     httpcore-4.4.4.jar
     jackson-jaxrs-json-provider-2.6.4.jar
     avalon-logkit-2.2.1.jar
     javax.servlet-api-4.0.0-b01.jar
     httpclient-4.5.1.jar
     jackson-jaxrs-json-provider-2.6.4.jar
     jackson-databind-2.7.0-rc1.jar
     jackson-annotations-2.7.0-rc1.jar
     jackson-core-2.7.0-rc1.jar
    

    If I missed any of the jar above , you can download from Maven here http://mvnrepository.com/artifact/com.fasterxml.jackson.core

    2)Java Class where you send your Post. First ,Convert with Jackson the Entity User to Json and then send it to your Rest Class.

    import com.fasterxml.jackson.databind.ObjectMapper;
    import ht.gouv.mtptc.siiv.model.seguridad.Usuario;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.json.simple.JSONObject;
    
    
    public class PostRest {
    
    
        public static void main(String args[]) throws UnsupportedEncodingException, IOException {
    
             // 1. create HttpClient
            DefaultHttpClient httpclient = new DefaultHttpClient();
    
            // 2. make POST request to the given URL
            HttpPost httpPost 
            = new HttpPost("http://localhost:8083/i360/rest/seguridad/obtenerEntidad");
    
    
            String json = "";
            Usuario u = new Usuario();
            u.setId(99L);
    
            // 3. build jsonObject
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id", u.getId());
    
            // 4. convert JSONObject to JSON to String
            //json = jsonObject.toString();
    
            // ** Alternative way to convert Person object to JSON string usin Jackson Lib
             //ObjectMapper mapper = new ObjectMapper();
             //json = mapper.writeValueAsString(person);
            ObjectMapper mapper = new ObjectMapper();
           json = mapper.writeValueAsString(u);
    
            // 5. set json to StringEntity
            StringEntity se = new StringEntity(json,"UTF-8");
    
    
            // 6. set httpPost Entity
            httpPost.setEntity(se);
    
            // 7. Set some headers to inform server about the type of the content   
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Content-type", "application/json");
    
            // 8. Execute POST request to the given URL
            HttpResponse httpResponse = httpclient.execute(httpPost);
    
            // 9. receive response as inputStream
            //inputStream = httpResponse.getEntity().getContent();
    
    }
    
    
    }
    

    3)Java Class Rest where you want to receive the Entity JPA/Hibernate . Here with your MediaType.APPLICATION_JSON you recieve the Entity in this way :

    ""id":99,"usuarioPadre":null,"nickname":null,"clave":null,"nombre":null,"apellidos":null,"isLoginWeb":null,"isLoginMovil":null,"estado":null,"correoElectronico":null,"imagePerfil":null,"perfil":null,"urlCambioClave":null,"telefono":null,"celular":null,"isFree":null,"proyectoUsuarioList":null,"cuentaActiva":null,"keyUser":null,"isCambiaPassword":null,"videoList":null,"idSocial":null,"tipoSocial":null,"idPlanActivo":null,"cantidadMbContratado":null,"cantidadMbConsumido":null,"cuotaMb":null,"fechaInicio":null,"fechaFin":null}"

        import javax.ws.rs.Consumes;
        import javax.ws.rs.GET;
        import javax.ws.rs.POST;
    
        import javax.ws.rs.Path;
        import javax.ws.rs.PathParam;
        import javax.ws.rs.Produces;
        import javax.ws.rs.core.MediaType;
        import org.json.simple.JSONArray;
    
        import org.json.simple.JSONObject;
        import org.apache.log4j.Logger;
    
        @Path("/seguridad")
        public class SeguridadRest implements Serializable {
    
    
    
           @POST
            @Path("obtenerEntidad")
            @Consumes(MediaType.APPLICATION_JSON)
            public JSONArray obtenerEntidad(Usuario u) {
                JSONArray array = new JSONArray();
                LOG.fatal(">>>Finally this is my entity(JPA/Hibernate) which 
    will print the ID 99 as showed above :" + u.toString());
                return array;//this is empty
    
            }
           ..
    

    Some tips : If you have problem with running the web after using this code may be because of the @Consumes in XML ... you must set it as @Consumes(MediaType.APPLICATION_JSON)

    0 讨论(0)
  • 2020-12-17 04:38

    You can try something like this

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    public Response callWol(WolRequest nid) {
         WolResponse response = new WolResponse();
         response.setResult(result);
         response.setMessage(nid.getValue().getId());
         return Response.status(Status.OK).entity(response).build();
    }
    

    You can try @PUT instead of @Post as well. Hope this helps

    0 讨论(0)
  • 2020-12-17 04:51

    Check this link https://www.vogella.com/tutorials/REST/article.html

    As per the code sample of method putTodo of class TodoResource , your code should be like this.

    @Path("test")
    public class Test{
    
        @PUT
        @Consumes("application/xml")
        @Produces({"application/xml", "application/json"})
        public WolResponse callWol(JAXBElement<WolRequest> nid) {
            WolResponse response = new WolResponse();
            response.setResult(result);
            response.setMessage(nid.getValue().getId());
    
            return response;
       }
    }
    

    Hope this will solve your problem.

    0 讨论(0)
提交回复
热议问题