4

我有一个简单的 WS,它是一个@PUT并接受一个对象

@Path("test")
public class Test {

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

        return response;
    }

我的客户端代码是......

WebResource wr = client.resource(myurl);
WolResponse resp = wr.accept("application/xml").put(WolResponse.class, wolRequest);

我正在尝试将一个实例传递WolRequest@PUTWeb 服务。尝试执行此操作时,我不断收到 405 错误。

如何通过 Jersey 将对象从客户端传递到服务器?我使用查询参数还是请求?

我的 POJO (WolRequestWolResponse) 都XMlRootElement定义了标签,因此我可以生成和使用 xml..

4

5 回答 5

1

我认为@PathParam这里的用法不正确。A@PathParam基本上可以是 a String(有关更多信息,请参见其 javadoc)。

你可以

  1. 使用@PathParam作为字符串参数或
  2. 不要将 WolRequest 定义为 @PathParam。

第一种方法:

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

这将接受诸如“text/12”之类的 url,然后 12 将是字符串 nid。看起来这不会帮助您尝试做的事情。

第二种方法:

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

您的客户端代码可以像您指定的那样,只有 PUT 的 url 是:“test”。也许您需要将一个@PathParam作为您的 id 和一个“正常”参数的组合来获取您的请求数据。

于 2010-02-08T16:27:34.570 回答
1

检查此链接https://www.vogella.com/tutorials/REST/article.html

根据类 TodoResource 的 putTodo 方法的代码示例,您的代码应该是这样的。

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

希望这能解决您的问题。

于 2010-05-21T11:41:32.580 回答
0

你可以试试这样的

@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();
}

您也可以尝试使用@PUT 而不是@Post。希望这可以帮助

于 2012-02-15T19:44:58.170 回答
0

试试这个它会工作

服务器端:

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

}// addRecord

客户端:

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);
}
于 2016-03-17T09:37:56.253 回答
0

顺便说一句,我在 Netbeans/Glashfish 中与Jackson在3 个步骤中解决了同样的问题。

1)要求:

我使用的一些罐子:

 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

如果我错过了上面的任何 jar,你可以从这里的 Maven 下载http://mvnrepository.com/artifact/com.fasterxml.jackson.core

2)您发送帖子的Java类。首先,使用 Jackson 将实体用户转换为 Json,然后将其发送到您的 Rest 类。

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 你想要接收实体 JPA/Hibernate 的地方。在这里,您可以使用 MediaType.APPLICATION_JSON 以这种方式接收实体:

""id": 99 ,"usuarioPadre":null,"昵称":null,"clave":null,"nombre":null,"apellidos":null,"isLoginWeb":null,"isLoginMovil":null," estado":null,"correoElectronic":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

        }
       ..

一些提示:如果您在使用此代码后运行网络有问题可能是因为 @Consumes in XML...您必须将其设置为@Consumes(MediaType.APPLICATION_JSON)

于 2015-12-10T22:34:20.033 回答