您可以将MultivaluedMap 作为参数放在资源方法中。这将是请求的正文。 JAX-RS 会为您将所有参数放入地图中。
@POST
@Consumes("application/x-www-form-urlencoded")
public Response post(@Context UriInfo uriInfo, MultivaluedMap params) {}
更新(编辑后的帖子)
所以如果你想获取过滤器中的参数,你可以从ContainerRequestContext获取body。对于 Jersey,您可以将 ContainerRequestContext 转换为 Jersey 的 ContainerRequest 实现,而不是使用 context.getEntityStream() 获取 InputStream。这将使您可以访问方法bufferEntity() 和readEntity()。这些方法将允许您轻松获取表单参数。您需要缓冲实体,以便稍后在需要将其传递给您的资源方法时对其进行读取。
@Provider
public class MyFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext context) throws IOException {
if (MediaTypes.typeEqual(MediaType.APPLICATION_FORM_URLENCODED_TYPE, context.getMediaType())) { {
return;
}
ContainerRequest request = (ContainerRequest) context;
request.bufferEntity();
Form form = request.readEntity(Form.class);
MultivaluedMap params<String, String> = form.asMap();
MultivaluedMap<String, String> query = context.getUriInfo().getQueryParameters();
}
}
如果您只想对特定资源方法使用过滤器,则可以使用Name Binding 或Dynamic Binding。
如果由于某种原因readEntity() 返回一个空地图(我见过很少有人遇到此问题),您可以尝试通过内部属性检索Form
Object formProperty = request.getProperty(InternalServerProperties.FORM_DECODED_PROPERTY);
if (formProperty != null) {
Form for = (Form) formProperty;
}