ruby-on-rails - request.format 返回 */*

标签 ruby-on-rails xml http curl mime-types

我目前正在为我在 RoR 上的应用程序开发 API

例如,我创建了一些 XML,加载了创建对象所需的所有信息,比方说一个人,然后使用 Curl 将其提交到我的应用程序

我能够准确地从 Controller 调用我想要的创建操作,并且对象的哈希参数被正确传递

但现在我需要应用不同的行为,无论是否使用 XML 发出请求,困扰我的是为什么在 Controller 中 request.format 给出 */*.

有什么线索吗?

curl -v -H "Content-Type: application/xml; charset=utf-8" --data-ascii @client.xml  http://foo.com:3000/clients?api_key=xxx

def create
  logger.debug request.format # produces "*/*"
  if request.format.xml?
    # never gets here 
  end
end

最佳答案

*/* 表示用户代理接受所有格式,不关心你给它什么格式。我相信 Safari 可以做到这一点。默认情况下,curl 发送 */* 的 Accept header 。

这是 curl 默认发送的 header 的转储:

User-Agent: curl/7.18.1 (i386-apple-darwin9.6.0) libcurl/7.18.1 zlib/1.2.3
Host: example.com
Accept: */*
Content-Type: 

但是,在这种情况下,如果发送给您的有效载荷是 XML,您似乎想要发回 XML?如果是这种情况,您需要直接检查请求的 Content-Type header 。即,request.content_type 是您想要的方法。

附录:我对此进行了更多思考,我认为最好的方法是首先检查 request.format,只有在不确定时才检查 请求.content_type。本质上,HTTP 规范允许客户端能够告诉服务器“我给你 XML,但我想要返回 JSON”。 Accept header 是客户告诉您他们想要返回什么的方式,如果有人实际发送了它,您应该尊重它。如果客户端未指定,则仅使用请求的 Content-Type 作为提示。

关于ruby-on-rails - request.format 返回 */*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1595424/

相关文章:

xml - 在Dart/Flutter中解析巨大的(3Gb)XML

http - 无法打开流 : HTTP request failed! HTTP/1.1 400 错误请求

ruby-on-rails - Rails 魔术方法 model_ids?

ruby-on-rails - 为什么嵌入式 ruby​​ 不能在公用文件夹的静态页面中工作?

sql-server - 是否可以在 SQL Server 2005/SQL Server 2008 的 XML 列中设置索引?

html - XSLT 按属性值排序

rest - Wildfly,重启服务器组

c# - 将各种数据一起发布的最佳方式(Web API)

ruby-on-rails - i18n Rails 来自助手的惰性查找?

ruby-on-rails - 使用 Devise 和 Omniauth 编辑用户