问题标签 [content-negotiation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
438 浏览

php - 在控制器层中进行内容协商可以吗?

在 Zend Framework 2 中,内容协商发生在视图层,我对此非常满意。我的控制器中的一个示例:

这要么呈现 view.phtml 模板以返回 html,要么将用户对象转换为 JSON 响应。所谓的视图策略决定了如何根据请求来渲染响应。

我的 webapp 中的“REST”应用程序流程

这种类型的内容协商适用于许多用例:

  1. /userindexAction()返回用户数组 => 可能的 JSON html;
  2. /user/1viewAction()返回用户对象 => 可能的 html 或 JSON(上面的示例);
  3. /user/1/updateupdateAction()返回一个 html 表单。出现错误时,此 url 的 POST 将返回 html 或 JSON。或者在成功时它重定向到viewAction()并因此返回用户的新版本 => html 和 JSON 再次可能;
  4. /user/createcreateAction()返回一个 html 表单。出现错误时,此 url 的 POST 将返回 html 或 JSON。或者在成功时,它viewAction()可能再次重定向到刚刚创建的用户 => html 和 JSON

我的问题

在一些用例中,内容协商在控制器层中是“必需的”。我不确定我是否忽略了一些可能性:是否有我可以在以下情况下使用的选项?

  1. 删除用户:POST 到/user/1/delete. 如果是 html 视图,您将被重定向到用户列表(现在已删除的用户已丢失)。如果你想要一个 JSON 响应,你想要返回 200 OK 和一个带有删除成功消息的 JSON 对象。
  2. 对博客文章发表评论。如果是 html 视图,您将被重定向到您看到附加评论的帖子。如果您要求 JSON 响应,您希望返回 200 OK 和一个带有您刚刚放置的评论的 JSON 对象。

我的目标是不复制视图层中已经存在的内容协商。这也会使我的控制器更胖,因为我现在有两种可能的响应(JSON 与 html),但这可能不是唯一的情况。如果我以后想要支持 XML 或其他格式,我会为这些响应类型的每个操作切换。

0 投票
1 回答
885 浏览

ruby-on-rails - 如何让 Rails 将发布的字符串解析为 json 而不发送 'Content-type: application/json' 标头?

当发送标头“Content-type: application/json”时,Rails 会在多个级别更改行为:

  • 提交的帖子正文被解析为 json 而不仅仅是字符串参数
  • config/initializers/wrap_parameters.rb 中的 wrap_parameters :format => [:json] 用于解析已发布的参数(因此您可以发送带有或不带有根元素的 json)

如果我不能信任(外部)客户端传递正确的标头怎么办?换句话说,我想让我的应用程序表现得好像客户端总是通过'Content-type:application/json'标头,即使客户端实际上没有?

0 投票
0 回答
133 浏览

mime-types - 样式表的内容协商失败

我有一个带有 MultiViews 的 Apache 服务器,这是我的目录布局:

在我的 index.xml 文件中,我引用了 XSL:

在 XSL 中,我引用了 CSS:

这种方法在我尝试过的任何浏览器中都不起作用。

在 Firefox-16.0.1 中,我看到以下消息:

我调试 HTTP 对话,我注意到 Firefox 正在发送:

Firefox 请求任何类型的内容,因此 Apache 选择发送 /style.css。

我希望需要特定内容类型的 Web 浏览器为这些内容类型发送明确的 Accept 标头。

当我发现另外两个明确记录摆脱 Accept 约束时,我准备提交一个错误。

我可以通过将扩展名放在文件名中来解决这个问题,但这应该与图像内容协商的工作方式相同,如W3C 博客中所述。好处是他们可以稍后添加新的内容类型,而无需更新任何文档。

这是一个错误,还是我有什么问题?

0 投票
1 回答
443 浏览

api - REST API,提供表示的变体。导出具有依赖关系的文件

我有一个关于服务不同资源表示的最佳实践的问题。我的用例比简单地以不同的内容类型(比如 xml 或 json)提供对象的表示要复杂一些。

背景:此 API 用于内容管理系统。API 的一个关键方面是用户可以请求文档的 zip 文件,以及它的所有依赖项(链接的图像和其他文档)。

例如,一个人可能会访问一个文档,/rest/all-documents/{doc-id}该文档将返回该文档的 XML 表示。

在为他们设计一种获取文档压缩包及其所有依赖项的方法时,我提出了一些选择:

  1. 使用内容协商并将Accept标头设置为特定于供应商的内容,即:vnd.company.compiled-doc+zip
  2. 使用子集合,例如/rest/all-documents/{doc-id}/export(Export 是动词,所以我不确定这是否标准化)
  3. 在只读的不同 URI 上提供服务:/rest/compiled-documents/{doc-id}

由于这个问题可能会一次又一次地出现,我很难确定设计这部分 API 的最佳方法是什么。到目前为止,我倾向于选项 3,

谢谢,

凯西

0 投票
1 回答
2628 浏览

web-services - RESTful 服务中的本地化

我有一个返回枚举的 RESTful 服务。

当我想到返回字符串将取决于客户端的语言环境时,我正在考虑是否为枚举值返回整数或字符串。

那么应该如何处理 REST 中的本地化呢?语言环境是 conneg 的一部分吗?

0 投票
2 回答
426 浏览

asp.net-mvc-4 - .NET MVC 4 内容协商不起作用

我有一个使用 .NET MVC 4 在 C# 中实现的 Web 服务,但由于某种原因,尽管我发送了一个 Accept: application/json 标头,但它们总是以 XML 格式返回数据。有什么想法可能是错的吗?

提前致谢

更新:控制器代码如下所示

更新 2:原始请求和响应

要求

回复

0 投票
2 回答
17879 浏览

content-negotiation - 接受语言列表

我想对浏览器发送到网站的 Accept_Language 做出反应。

有人知道我在哪里可以获得浏览器可能发送到网站的所有可用 Accept_Languages 的可靠列表吗?

非常感谢你!

0 投票
4 回答
14604 浏览

spring - Spring 3.2 内容协商类强制转换异常

我们使用 Spring MVC 开发了一个标准的 Java Web 应用程序,并且最近尝试从 3.0.6 升级到 3.2.0。我们几乎所有的 servlet 响应都是 JSP 或 Json 视图,但也有一些是 pdf 请求,扩展名为“pdf”。

在 Spring 3.0.6 中,我们进行了此设置,取自 Spring MVC 文档。

与 XMLViewResolver 结合使用效果很好。

更新到3.2.0后,出现故障:

在调查了文档和一些博客之后,这个配置似乎有效:

但是,我们已经尝试使用此配置运行新的 Spring MVC 测试框架,并再次获得 ClassCast 异常,所以似乎测试框架没有以与应用程序运行时相同的方式初始化 bean... 有没有人有清楚地解释如何在 Spring 3,2 中以健壮的方式配置 ContentNegotiatingViewResolver?谢谢

理查德

0 投票
3 回答
3100 浏览

java - Spring MVC 3.2 - 错误页面的内容协商?

为了全局处理可能在控制器之外发生的错误(例如 HTTP 404),我的 web.xml 中有类似于以下内容的条目:

在我的 ErrorController 中,我有类似以下的相应方法:

我面临的问题是ContentNegotiationManager我配置的和消息转换器在这种情况下没有被使用。我怀疑由于请求被重定向到错误页面,内容协商中使用的原始请求属性丢失了,这被视为一个完全独立的请求。(即对 /mycontroller/badresource.json 的原始请求 --> /errors/404(无文件扩展名))

像这样的错误处理程序中是否有任何方法可以确定和/或响应原始请求中请求的适当内容类型?

0 投票
1 回答
260 浏览

xml - 同一实体的不同 REST-ful 表示和内容协商

鉴于 REST-ful Web 服务

返回 Content-Type 的 Product XML 文档

我也需要支持

(x-esvc 是自定义 MIME 类型;产品和价格是两个子类型,+xml 暗示它是基于RFC 3023的基于 XML 的格式)

问题是第二种格式是否应该有自己的网络服务

...或者我是否应该使用内容协商和 Accept HTTP 标头来区分现有产品 Web 服务中的两种格式?

请注意,仅涉及一个真实实体(产品),并且“价格”是 OO 术语中的依赖对象列表。但是,在这两种情况下都可以使用相同的标识符。

表述该问题的另一种方法是“价格”是否可以被视为同一资源的不同表示,或者如果信息不同,是否应该将其视为另一种资源?

我确实知道内容协商通常用于区分同一图像的不同技术格式,例如 JPG 和 PNG。即信息相同但格式不同。在这种情况下,内容协商将用于区分同一实体的不同信息。

这会是 REST-ful Web 服务中对 Content Negotiation 和 Accept HTTP 标头的有效使用吗?