Jersey2:一起消耗 APPLICATION_FORM_URLENCODED 和 MULTIPART_FORM_DATA

Jersey2: Consumes APPLICATION_FORM_URLENCODED and MULTIPART_FORM_DATA together

我是第一次使用 Jersey。

我只希望我的服务接受 APPLICATION_FORM_URLENCODEDMULTIPART_FORM_DATA post 形式,就像在 Django 或 php.

中一样

更好的是,我希望 APPLICATION_JSON 也可以。

所以我在 UserResource class:

中尝试了下面的代码
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA})
@Produces(MediaType.APPLICATION_JSON)
public User createUser(
        @FormDataParam("username") @FormParam("username") String username,
        @FormDataParam("password") @FormParam("password") String password,
        @FormDataParam("mobile") @FormParam("mobile") String mobile,
        @FormDataParam("email") @FormParam("email") String email) {
    User user = new User();
    user.setUsername(username);
    user.setMobile(mobile);
    user.setEmail(email);
    user.setPlainPassword(password);
    userDao.save(user);
    return user;
}

然后我用 x-www-url-form-urlencoded 提交成功,但是当我用 multipart/formdata 提交时,它下降了:

而当我删除@FormParam注释时,它不能接受x-www-url-form-urlencoded提交,并显示:


所以这是我的问题:

1。有什么办法可以让它们一起工作吗?

2。是否有像 @JsonParam 这样的参数类型接受 application/json 的请求表单类型?

请使用消费为@Consumes({MediaType.MULTIPART_FORM_DATA})。 这样端点就可以接受多部分对象和表单数据,如下所示

@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("email") String email)

请从邮递员那里测试它,因为表单数据和文件应为 'file' 类型,电子邮件应为 'text'

类型

最后我自己找到了解决方案:

Jersey 使用不同的 @{METHOD}@Consumes@Path 路由请求。

因此,如果我们在资源中声明两个不同的方法,它们具有相同的 @POST 方法,相同的 @Path("/"),但不同的 @Consumes

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public User create(
        @FormParam("username") String username,
        @FormParam("password") String password,
        @FormParam("mobile") String mobile,
        @FormParam("email") String email) {
    User user = new User();
    user.setUsername(username);
    user.setMobile(mobile);
    user.setEmail(email);
    user.setPlainPassword(password);
    userDao.save(user);
    return user;
}

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public User createUser(
        @FormDataParam("username") String username,
        @FormDataParam("password") String password,
        @FormDataParam("mobile") String mobile,
        @FormDataParam("email") String email) {
    User user = new User();
    user.setUsername(username);
    user.setMobile(mobile);
    user.setEmail(email);
    user.setPlainPassword(password);
    userDao.save(user);
    return user;
}

看,然后当我们发出一个 Content-Type 等于 x-www-form-urlencoded 的请求时,请求就会被路由到第一个方法。或者当我们 post 与 Content-Type 相同的 url 等于 multipart/formdata 时,请求将路由到第二个

而且我们可以单独编写交易工作,它使用 @FormParam@FormDataParam,但不能同时使用两者。