当前位置: 首页 > 面试题库 >

泽西岛:未设置content-type时,@ Consumes不太起作用

浦德明
2023-03-14
问题内容

我试图弄清楚@Consumes在这里如何工作。

我有一个如下所示的简化资源,并且我只希望此资源使用“ application / vnd.myApp + xml”。

@Path("/app")
@Consumes("application/vnd.myApp+xml")
@Produces("application/vnd.myApp+xml")
public class AppResource {
    @POST
    public Response postStuff() {
        ...
    }
}

我有以下测试用例:

public class AppResourceTest extends JerseyTest {
    @Test
    public void testApp() {
        // #1: Works fine
        ClientResponse response = resource().path("app")
                    .accept("application/vnd.myApp+xml")
                    .post(ClientResponse.class);

        ...

        // #2: Throws a 415 Unsupported Media Type
        ClientResponse response = resource().path("app")
                    .accept("application/vnd.myApp+xml")
                    .type("text/plain")
                    .post(ClientResponse.class);

        ...

        // #3: Works fine
        ClientResponse response = resource().path("app")
                    .accept("application/vnd.myApp+xml")
                    .type("application/vnd.myApp+xml")
                    .post(ClientResponse.class);

        ...
    }
}

从上面的3个测试中,#2和#3按预期工作。

至于#1,如果我没有设置content-type,为什么它也不会抛出415?


问题答案:

基于@Consumes
api(http://jsr311.java.net/nonav/releases/1.0/javax/ws/rs/Consumes.html)和HTTP类型规范(http://www.w3.org/Protocols/
rfc2616 /
rfc2616-sec7.html#sec7.2.1

)以及您所看到的行为,我认为可以得出以下泽西实现的结论是安全的:

如果客户端未设置Content-Type,则Jersey不会默认设置,但允许它通过任何/所有@Consumes注释。

如果为URI设置了多个@Consumes {不同类型},并且客户端未设置Content-
Type,则Jersey将默认为第一个@Consumes批注或可接受类型列表中的第一个类型。

设置“接受”标头值时,Jersey将找到最佳拟合方法来执行。如果最适合多种方法,则默认为第一个定义的方法。

总结@Consumes仅在且仅当客户端设置了Content-Type时才充当过滤器,否则Jersey将尝试查找最合适的匹配项。这确实符合HTTP规范:

任何包含实体主体的HTTP / 1.1消息都应包含定义该主体媒体类型的Content-Type头字段。当且仅当Content-
Type字段未提供媒体类型时,接收方可以通过检查其内容和/或用于标识资源的URI的名称扩展来尝试猜测媒体类型。如果媒体类型仍然未知,则接收者应将其视为“应用程序/八位字节流”类型。

如果目标是让@Consumes充当白名单,则可以使用servlet过滤器将未设置任何请求的内容类型默认为内容类型。



 类似资料:
  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我有一个问题,让昂首阔步的博士一代工作。 以下是我使用的专家: 我在ResourceConfig类中添加了swagger ressources: 然后我声明了一个 servlet 来配置 Swagger: 通过上面的配置,可以使用swagger servlet:如果我浏览到api文档url,我会得到以下信息: 但是,如果我使用如下所示的真实配置更改 swagger servlet 配置中的 api

  • 问题内容: 我正在尝试编写一个AngularJS资源模块,它将一些数据发布到服务器。默认的内容类型似乎是“ application /xml”。我试图将内容类型覆盖为“ application / x-www-form-urlencoded”。当执行普通的$http.post()时,我可以设置内容类型,当我检入Firebug时,可以看到设置正确。当我使用资源的POST方法时,无法获得要从默认值更改

  • 问题内容: 我有一个Jersey REST API,并且正在使用来处理授权。我还在所有端点上使用,以便我的API可以处理数千个并发请求。 我的授权过滤器命中了一个远程服务,但是当运行过滤器时,Jersey尚未将当前线程添加到它的内部,因此我完全失去了异步的好处。 我可以告诉Jersey我希望这是异步的吗? 这是一个示例资源: 更新 刚刚收到泽西队球员的回音,从2.7开始,这是不可能的。只有资源方法

  • 我很难理解泽西岛的注入机制。JAX-RS规范(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)指出,在应用程序子类、根资源类和提供程序中可以通过@Context进行注入。 我现在有一个在启动时实例化的类,并且有一个在每次请求时调用的方法。在方法内部,我需要访问当前的UriInfo对象。问题是,这个方法不是从我的

  • 我正在泽西岛2中编写一个RESTful网络服务。我想支持响应的 Gzip 编码。按照这个答案,我在我的类中启用了。 在我的资源类中,我返回一个对象。 现在,当我点击这个api时,我得到一个响应,但响应头不包含头,而是包含 header。 请求: 响应: 响应中没有 标头,也没有任何标头。 我在上使用。 我还遗漏了其他配置吗?我如何获得这两个头并得到gzip压缩的响应,而不是接收分块的响应? 编辑: