如果 @Produces 注释缺失,球衣服务会返回什么?

2024-01-11

我开始学习开发安全的网络服务。

正如我注意到的,大多数示例都使用以下注释:

@Consumes

定义输入参数的格式

@Produces

定义输出参数的格式

但在实际代码中我看到的方法如下所示:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/login")
public Response login(@FormParam("login") final String username, @FormParam("password") final String password){...}

我看到这个方法使用POSTHTTP 方法。参数userName and password将有形式根据@Consumes(MediaType.APPLICATION_FORM_URLENCODED)。我看到执行此方法的 URL。

但我不明白这个方法返回什么。哪种格式?


我只是想澄清一下“如果未指定,默认情况下 Jersey 会生成“application/octet-stream””并不完全正确。实际上幕后发生了很多复杂的事情,这决定了最终的结果Content-Type。正如规范中所述:

注意上面的(实际上below:-) 使用默认媒体类型呈现响应application/octetstream 当无法确定具体类型时.

但是,正如我所说,有一个复杂的算法可以确定这种“具体类型”。我测试过的情况并不多application/octet-stream。它如下所示(这直接来自规范。您可以尝试制作它的头部或尾部,但这不适合外行):

3.8 确定响应的媒体类型

In many cases it is not possible to statically determine the media type of a response. The following algorithm is used to determine the response media type, Mselected, at run time:

  1. If the method returns an instance of Response whose metadata includes the response media type (Mspecified) then set Mselected = Mspecified, finish.

  2. 收集可制作的媒体类型集P:

    • 如果该方法被注释为@Produces, set P = {V(方法)} 其中V (t) 代表的值@Produces在指定目标上t.
    • 否则,如果该类被注释为@Produces, set P= {V(类)}。
    • 其他设置P = {V(作家)} 其中 'writers' 是一组MessageBodyWriter支持返回的实体对象的类。
  3. If P= {},设置P = {'*/*'}

  4. 获取可接受的媒体类型A. If A= {},设置A = {'*/*'}

  5. Set M= {}。对于每个成员A; a:

    • For each member of P; p:
      1. 如果a兼容p, add S(a; p) to M,其中函数S返回 q 值为该对中最具体的媒体类型a和服务器端 qs 值p.
  6. If M= {} 然后生成一个NotAcceptableException(406 状态)并且没有实体。必须按照第 3.3.4 节中的描述处理异常。结束。

  7. Sort M按降序排列,并具有特定的主键(n/m > n/* > */*),q-value 的辅助键和 qs-value 的第三键。

  8. 对于每个成员M; m:

    • If m is a concrete type, set Mselected = m, finish.
  9. If M contains '*/*' or 'application/*', set Mselected = 'application/octet-stream', finish.

  10. 生成一个NotAcceptableException(406 状态)并且没有实体。必须按照第 3.3.4 节中的描述处理异常。结束。

你可以看到这并不像说的那么容易,它总是默认为application/octet-stream。简单的例子

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createCustomer(@FormParam("id") int id, 
                               @FormParam("name") String name) {
    return Response.ok("OK I GOT IT").build();
}

上面会返回Content-Type: text/plain

假设你创建了一个Customer对象并返回它

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createCustomer(@FormParam("id") int id, 
                               @FormParam("name") String name) {
    Customer customer = new Customer(id, name);
    return Response.ok(customer).build();
}

根据我的测试,它会返回Content-Type: application/xml是的,身体内容will是 XML。

现在,如果我们发送带有Accept标题为application/json,我们将得到一个响应头Content-Type: application/json,是的,正文内容将是 json。这就是内容协商发挥作用的地方

如果我们只是回应201 Created,这在POST/创建请求

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response createCustomer(@FormParam("id") int id, 
                               @FormParam("name") String name) {
    return Response.created(someNewUri).build();
}

将有no Content-Type响应头,因为没有内容。

现在,上面的一些示例并不是很好的 REST 主要示例,但它表明,如果我们没有明确设置媒体类型,那么确定媒体类型需要做很多工作@Produces。您必须考虑响应的正文,可用MessageBodyWriters, 你有内容协商 http://en.wikipedia.org/wiki/Content_negotiation考虑在内,以及规范中那些胡言乱语中的其他内容。 (注意:我将“内容协商”链接加粗,因为这是一个您在使用 REST 时应该真正熟悉的概念。它实际上在 JAX-RS/Jersey 中发挥着重要作用)。

所以你问题的答案实际上是这取决于。但希望您从这篇文章中获得了一些额外的知识:-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果 @Produces 注释缺失,球衣服务会返回什么? 的相关文章

随机推荐

  • R:如何在具有自由范围轴的facet_grid上使用coord_cartesian

    考虑一些facet grid plot mt lt ggplot mtcars aes mpg wt colour factor cyl geom point mt facet grid vs am scales free 想象一下我只想放
  • 干预 imagick 在终端中有效,但在浏览器中无效

    我完全不明白出了什么问题 我已经按照指导安装了干预here http image intervention io 然后我创建了以下 php 文件并启动了我的 localhost Apache 服务器并测试了结果 它成功了 这是代码 test
  • 如何安装更新的 MSBuild 版本?

    我正在尝试从源代码构建 Microsoft AspnetCore Identity 说明在这里 https github com dotnet aspnetcore blob master docs BuildFromSource md h
  • 材质设计 - 操作栏标题和内容的左边距不匹配

    我正在尝试按照以下准则设置屏幕边距布局 指标和关键线 https www google com design spec layout metrics keylines html 具体来说 移动屏幕上的列表内容应具有 72 dp 的边距 并与
  • 替换java中的字符序列

    我正在解析一个结构不良的 rss feed 并且返回的一些数据已 p at在里面 我怎样才能替换所有实例 p p at有一个空格 使用java 我很熟悉 replaceString 类的方法 但我不确定正则表达式的外观 我试过inputSt
  • 实施 Rijndael 解密时是否可以不使用 IV?

    我正在使用 Rijndael 算法实现密文解密 不幸的是 我无法访问数据的加密 并且只提供了密码 用于生成密钥 和算法类型 我没有盐 看起来没问题 也没有静脉注射 现在 我的问题是我是否绝对必须拥有 IV 才能执行解密 我怀疑编写加密的开发
  • 从字符串java中提取日期

    我有一个包含多个日期的字符串 例如 20 Jul 2012 5 11 36 670 UTC PM 20 Jul 2012 5 11 36 683 UTC PM 如何读取该字符串并提取每个日期 我正在使用SimpleDateFormat类来创
  • 将不同层独立部署到 Azure

    假设我有一个应用程序 它分为各个层 演示 业务 数据访问 如何将这些层独立部署到Azure 问题是关于Azure配置 而不是关于应用程序的架构 应用程序通常分为各种角色 每个角色都是 Windows Server 2008 R2 具有已定义
  • CardMedia高度材质-ui

    我正在努力尝试改变 CardMedia 内图像的高度 我设置样式 const style height 32 并将其用于
  • 使用 pip 从 github 的特定分支安装包

    我遇到了一个非常奇怪的问题 我尝试从我的 github fork 中 pip 安装一个包 我过去曾多次这样做过 而且总是有效 这就是我所做的 pip install git https my branch 虽然这在我的本地计算机上工作得很好
  • Python beautifulsoup 抢表

    我正在尝试从此网页中获取表格 我不确定我是否抓住了正确的标签 这是我到目前为止所拥有的 from bs4 import BeautifulSoup import requests page http www airchina com cn
  • 使用 LINQ to SQL 是否有助于防止 SQL 注入

    我正在建立一个公共站点 我首先想到的是 SQL 注入 我正在保存一些文本字段 并使用 linq 来更新 写入数据库 我使用 linq 安全吗 此示例正在创建用户帐户 Data MemberRegistrationDataContext co
  • 如何在 Android 中关闭/销毁 Firebase 引用?

    这是场景 创建了 firebase 引用 Firebase myRef new Firebase url In Main Activity 用户单击按钮导航到其他活动 调用主活动的 onPause 有没有办法销毁这个构造函数 此引用正在创建
  • Base64 编码图像 blob 未在 IE 中显示

    echo img src height 150 这在 firefox safari 和 chrome 中显示的图像效果很好 但在 Internet Explorer 中它显示了一个漂亮的红十字 我认为这是因为编码的原因 尝试更换data i
  • Nlog目标数据库在运行时设置连接信息

    使用 Nlog 和数据库目标 有没有办法在运行时设置连接信息 我记得我的一些同事也做过类似的事情 他找到了这样的答案 http nlog forum 1685105 n2 nabble com DDL for Database Table
  • 溢出:隐藏不适用于正方向的平移

    我最近遇到了一件奇怪的事情overflow hidden 我将它设置为一个元素 然后我想将其中的元素转换为translate 当它向负方向平移时 它将被隐藏 但如果我向正方向平移 它就不会被隐藏 在桌面浏览器中 它并没有真正显示出来 但您可
  • sp_executesql 与 'IN' 语句

    我试图使用 sp executesql 来防止 SQL 2005 中的 SQL 注入 我有一个像这样的简单查询 SELECT from table WHERE RegionCode in X101 B202 但是 当我使用 sp execu
  • 函数后面的const如何优化程序?

    我见过一些这样的方法 void SomeClass someMethod const 这个 const 声明有什么作用 它如何帮助优化程序 Edit 我看到这个问题的第一部分之前已经被问过 BUT 它仍然没有回答第二部分 这将如何优化程序
  • 可编辑文本字段的 UITableView 列表

    我知道这可能不符合 Apple 的 iPhone 人机界面指南 但我想摆脱一级推送视图并拥有可编辑文本字段的列表 此外 我希望当视图出现时键盘从一开始就出现在屏幕上 问题是 当我有超过三个这样的字段时 弹出键盘将覆盖下面的字段 用户无法向下
  • 如果 @Produces 注释缺失,球衣服务会返回什么?

    我开始学习开发安全的网络服务 正如我注意到的 大多数示例都使用以下注释 Consumes 定义输入参数的格式 Produces 定义输出参数的格式 但在实际代码中我看到的方法如下所示 POST Consumes MediaType APPL