使用泽西休息的Post方法并从网址获取参数

时间:2011-10-15 06:44:13

标签: java rest jersey

我想开发休息api。如:  http://localhost:8080/TestSomeWay/resources/test/create?meg=sadasd&name=sadasd 从urlparams exp。“meg”&“name”获取params 我正在使用球衣来开发一种Restful post方法 它没有成功 代码:

@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
@Override
public String create( @FormParam("meg")String megString, @FormParam("name")String nameString) {
   TestUser testUser=new TestUser();
   testUser.setMeg(megString);
   testUser.setName(nameString);
   em.persist(testUser);
   em.flush();
   return testUser.getId().toString();

}

2 个答案:

答案 0 :(得分:5)

您似乎对您要实现的目标感到困惑,并且这显示为不连贯的API。一旦你出错了,那就太奇怪了,事情出了问题!

首先,您必须弄清楚您是使用GET,PUT还是POST,在后两种情况下,您正在使用的内容类型(或类型)是什么,如PUT和POST通常是处理传入的文件。此外,如果你正在做任何不是幂等的事情(也就是说,如果你连续两次做它就像是一样),那么你肯定应该使用POST;经典的例子是支付一些商品,你肯定不想做两次,而设置你的喜好可以是幂等的。最后的复杂性是将查询参数与正文混合通常是不好的风格;要么参数在查询部分中,要么它们在正文中(或者它们在路径中,但在这种情况下,您在概念上处理不同的资源)。

如果你只是处理HTML表单,那么你想要的两种方法就是这样:

@GET
@Path("/create")
@Produces(MediaType.TEXT_PLAIN)
public String createFromGet(
        @QueryParam("meg") String meg,
        @QueryParam("name") String name) {
    ...
    return theString;
}
@POST
@Path("/create")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_PLAIN)
public Response createFromPost(
        @FormParam("meg") String meg,
        @FormParam("name") String name) {
    ...
    return Response.created(theNewUrl).entity(theString).build();
}

第一个处理像/create?meg=foo&name=bar这样的网址上的GET,第二个处理对/create这样的网址的POST。但是,鉴于名称“create”,我很想使用POST版本,而不是尝试支持在查询部分中编码参数;创造是那些往往不是幂等的东西。

请注意,我假设您的创建正在创建一个资源(这是一个很好的RESTful编程!)所以我调整为返回正确的响应;它比平常更多参与,但这是正确的。

答案 1 :(得分:0)

您应该QueryParam而不是FormParam来获得所需的功能