我目前正在为我在 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/