问题标签 [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.
php - 在控制器层中进行内容协商可以吗?
在 Zend Framework 2 中,内容协商发生在视图层,我对此非常满意。我的控制器中的一个示例:
这要么呈现 view.phtml 模板以返回 html,要么将用户对象转换为 JSON 响应。所谓的视图策略决定了如何根据请求来渲染响应。
我的 webapp 中的“REST”应用程序流程
这种类型的内容协商适用于许多用例:
/user
或indexAction()
返回用户数组 => 可能的 JSON html;/user/1
或viewAction()
返回用户对象 => 可能的 html 或 JSON(上面的示例);/user/1/update
或updateAction()
返回一个 html 表单。出现错误时,此 url 的 POST 将返回 html 或 JSON。或者在成功时它重定向到viewAction()
并因此返回用户的新版本 => html 和 JSON 再次可能;/user/create
或createAction()
返回一个 html 表单。出现错误时,此 url 的 POST 将返回 html 或 JSON。或者在成功时,它viewAction()
可能再次重定向到刚刚创建的用户 => html 和 JSON
我的问题
在一些用例中,内容协商在控制器层中是“必需的”。我不确定我是否忽略了一些可能性:是否有我可以在以下情况下使用的选项?
- 删除用户:POST 到
/user/1/delete
. 如果是 html 视图,您将被重定向到用户列表(现在已删除的用户已丢失)。如果你想要一个 JSON 响应,你想要返回 200 OK 和一个带有删除成功消息的 JSON 对象。 - 对博客文章发表评论。如果是 html 视图,您将被重定向到您看到附加评论的帖子。如果您要求 JSON 响应,您希望返回 200 OK 和一个带有您刚刚放置的评论的 JSON 对象。
我的目标是不复制视图层中已经存在的内容协商。这也会使我的控制器更胖,因为我现在有两种可能的响应(JSON 与 html),但这可能不是唯一的情况。如果我以后想要支持 XML 或其他格式,我会为这些响应类型的每个操作切换。
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'标头,即使客户端实际上没有?
mime-types - 样式表的内容协商失败
我有一个带有 MultiViews 的 Apache 服务器,这是我的目录布局:
在我的 index.xml 文件中,我引用了 XSL:
在 XSL 中,我引用了 CSS:
这种方法在我尝试过的任何浏览器中都不起作用。
在 Firefox-16.0.1 中,我看到以下消息:
我调试 HTTP 对话,我注意到 Firefox 正在发送:
Firefox 请求任何类型的内容,因此 Apache 选择发送 /style.css。
我希望需要特定内容类型的 Web 浏览器为这些内容类型发送明确的 Accept 标头。
当我发现另外两个明确记录摆脱 Accept 约束时,我准备提交一个错误。
我可以通过将扩展名放在文件名中来解决这个问题,但这应该与图像内容协商的工作方式相同,如W3C 博客中所述。好处是他们可以稍后添加新的内容类型,而无需更新任何文档。
这是一个错误,还是我有什么问题?
api - REST API,提供表示的变体。导出具有依赖关系的文件
我有一个关于服务不同资源表示的最佳实践的问题。我的用例比简单地以不同的内容类型(比如 xml 或 json)提供对象的表示要复杂一些。
背景:此 API 用于内容管理系统。API 的一个关键方面是用户可以请求文档的 zip 文件,以及它的所有依赖项(链接的图像和其他文档)。
例如,一个人可能会访问一个文档,/rest/all-documents/{doc-id}
该文档将返回该文档的 XML 表示。
在为他们设计一种获取文档压缩包及其所有依赖项的方法时,我提出了一些选择:
- 使用内容协商并将
Accept
标头设置为特定于供应商的内容,即:vnd.company.compiled-doc+zip - 使用子集合,例如
/rest/all-documents/{doc-id}/export
(Export 是动词,所以我不确定这是否标准化) - 在只读的不同 URI 上提供服务:
/rest/compiled-documents/{doc-id}
由于这个问题可能会一次又一次地出现,我很难确定设计这部分 API 的最佳方法是什么。到目前为止,我倾向于选项 3,
谢谢,
凯西
web-services - RESTful 服务中的本地化
我有一个返回枚举的 RESTful 服务。
当我想到返回字符串将取决于客户端的语言环境时,我正在考虑是否为枚举值返回整数或字符串。
那么应该如何处理 REST 中的本地化呢?语言环境是 conneg 的一部分吗?
asp.net-mvc-4 - .NET MVC 4 内容协商不起作用
我有一个使用 .NET MVC 4 在 C# 中实现的 Web 服务,但由于某种原因,尽管我发送了一个 Accept: application/json 标头,但它们总是以 XML 格式返回数据。有什么想法可能是错的吗?
提前致谢
更新:控制器代码如下所示
更新 2:原始请求和响应
要求
回复
content-negotiation - 接受语言列表
我想对浏览器发送到网站的 Accept_Language 做出反应。
有人知道我在哪里可以获得浏览器可能发送到网站的所有可用 Accept_Languages 的可靠列表吗?
非常感谢你!
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?谢谢
理查德
java - Spring MVC 3.2 - 错误页面的内容协商?
为了全局处理可能在控制器之外发生的错误(例如 HTTP 404),我的 web.xml 中有类似于以下内容的条目:
在我的 ErrorController 中,我有类似以下的相应方法:
我面临的问题是ContentNegotiationManager
我配置的和消息转换器在这种情况下没有被使用。我怀疑由于请求被重定向到错误页面,内容协商中使用的原始请求属性丢失了,这被视为一个完全独立的请求。(即对 /mycontroller/badresource.json 的原始请求 --> /errors/404(无文件扩展名))
像这样的错误处理程序中是否有任何方法可以确定和/或响应原始请求中请求的适当内容类型?
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 标头的有效使用吗?