Jersey2:一起消耗 APPLICATION_FORM_URLENCODED 和 MULTIPART_FORM_DATA
Jersey2: Consumes APPLICATION_FORM_URLENCODED and MULTIPART_FORM_DATA together
我是第一次使用 Jersey。
我只希望我的服务接受 APPLICATION_FORM_URLENCODED
和 MULTIPART_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
,但不能同时使用两者。
我是第一次使用 Jersey。
我只希望我的服务接受 APPLICATION_FORM_URLENCODED
和 MULTIPART_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
,但不能同时使用两者。