0

考虑以下示例:

创建新用户

此网址的 POST 请求:www.example.com/accounts/checking/users

获取用户详细信息

获取此网址的请求:www.example.com/accounts/checking/user/1

为 id 为 1 的用户返回资源。

现在我的问题是,当我发布到 www.example.com/accounts/checking/users 以创建新用户时,会创建一个新用户,并且必须在位置标头中返回其资源 uri。我无法使用 getAbsoluteURIbuilder 方法构建此 uri。

这是我所拥有的

@Path("/accounts)
public class AccountResourceService {

@Context
UriInfo uriInfo

//这里的'type'可以是支票或储蓄账户

@GET
@PATH("{type}/user/{id}")
@Produces(MediaType.APPLICATION_JSON)
public class getUserInfo(final @PathParam("type") String type, @PathParam("id"), int id)
{
    //return user-specific resource for the given id
}


@POST
@PATH("{type}/users")
@Produces(MediaType.APPLICATION_JSON)
public class CreateUser(final @PathParam("type") String type, AccountCreateRequest request)
{
   if type.equals("checking"){
      User user = createAccount(request);
      URI uri = uriInfo.getAbsolutePathBuilder().path(user.getId().toString()).build();
      System.out.println("created uri is " + uri.toString);
      return Response.created(uri).build(); 
    }
    else {
       //do something else
        }

}

}

我在上面的 POST 方法中返回的 uri 是

http://localhost:8080/accounts/checking/users/1 //note users

但预期的 uri 是

http://localhost:8080/accounts/checking/user/1 //not user

我怎样才能让它工作?

4

1 回答 1

0

只是将所有评论放入答案中

从设计的角度来看,我说你只是摆脱了用户资源路径,并使其成为用户/{id}。这是常见且被接受的方式。users 是一个集合资源。当你转到 /users 时,你会得到用户的集合。当您转到 users/234 时,您会在该用户集合中获得 id 为 234 的用户。

但是你可以改变这一点,你可以通过一些字符串操作来构建 uri。getAbsolutePath()从 中获取UriInfo,然后只需删除s. 然后您可以UriBuilder使用该字符串创建一个新的。如下例所示

@Path("/accounts")
public class AccountsResource {

    @POST
    @Path("/{type}/users")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUser(@PathParam("type") String type,
                               @Context UriInfo uriInfo) {

        String newUri = uriInfo.getAbsolutePath().toString();
        newUri = newUri.substring(0, newUri.length() - 1);
        UriBuilder builder = UriBuilder.fromPath(newUri);
        URI uri = builder.path("1234").build();

        return Response.created(uri).build();
    }
}

这将返回/accounts/checking/user/1234

于 2014-12-18T02:10:28.023 回答