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

use*_*505 2 java rest jersey

我想开发rest api.例如: http:// localhost:8080/TestSomeWay/resources/test/create?meg = sadasd&name = sadasd 并从urlparams exp获取params."meg"&"name"我使用的是jersey开发一个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();

}
Run Code Online (Sandbox Code Playgroud)

Don*_*ows 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;
}
Run Code Online (Sandbox Code Playgroud)
@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();
}
Run Code Online (Sandbox Code Playgroud)

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

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