我有使用Jersey
创建的API目前,用户可以向其发出POST请求。由于所有信息都在网址中,因此不需要正文。
@POST
@Path("entries")
@Produces(MEDIATYPE_JSON_AND_XML)
public Response createEntry(){
...
}
创建一个新的空条目,并返回id。 内容 - 请求的类型并不重要,因为没有请求正文数据。
现在还应该可以使用FormData在请求期间设置新条目的特定字段。对于此请求,需要正文,Content-Type
必须为multipart/form-data
。
所以我创建了第二个功能:
@POST
@Path("entries")
@Consumes("multipart/form-data");
@Produces(MEDIATYPE_JSON_AND_XML)
public Response createEntryWithParam(@FormDataParam('param') String param){
...
}
第二个功能是在请求中发送参数。但是通过添加它,第一个停止工作。
发送没有Content-Type
的请求会抛出NullPointerException
。可能是因为@Consumes
触发了某种Content-Type
- 检查,但失败了。
有没有办法让一个端点接受带或不带请求体的POST请求?
编辑所以,我想在seconds函数中接收所有multipart / form-data请求,并使用第一个作为对该端点的其他POST请求的一个catch-all
答案 0 :(得分:3)
目前,我有一个解决方案。 如果POST请求没有MediaType(Content-Type)或request-body,我会自动添加一个空的JSON对象并相应地设置Content-Type。
@Provider
public class ContentTypeRequestFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext crc) throws IOException {
if (crc.getMethod().equals("POST") && crc.getMediaType() == null && crc.getLength() == -1){
crc.getHeaders().add("content-type", MediaType.APPLICATION_JSON);
InputStream in = IOUtils.toInputStream("{}");
crc.setEntityStream(in);
}
}
}
这可行,但在我看来有点 hacky 。我很想知道是否有更好的方法来达到我想要的结果。