我目前正在开发用于我的RoR应用程序的API
举个例子,我创建了一些XML,装载着所有的信息,我需要创建对象,比方说,一个人,使用curl我提交给了我的应用程序
我能准确地调用创建操作我从控制器要与对象的哈希PARAMS正确传递
但现在我需要的,如果有人要求或不符合XML应用不同的行为,是什么在困扰我的是,为什么在控制器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
发送接受的头部*/*
。
这里是头的转储curl
默认情况下发送:
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头。 即, request.content_type
是你想要的方法。
附录:我想详细了解一下这一点,我认为最好的办法是先检查request.format
且仅当是不确定的检查request.content_type
。 从本质上讲,HTTP规范提供了客户能够告诉服务器“我给你的XML,但我想JSON回来了。” Accept报头是客户端如何告诉你他们想要的东西回来,如果有人实际上发送它,你应该兑现这一点。 只有使用请求的Content-Type作为提示,如果客户没有明确说明。
*/*
只意味着所有MIME类型都可以接受。
综观为代码request.format
方法中,MIME类型由文件扩展名来确定,或者,如果这不是由HTTP的值,则呈现Accept首部。 所以,你要么需要通过卷翘保存到磁盘上一个XML文件,或得到卷曲设置Accept头为XML MIME类型(例如text/xml
),当它发出请求到你的API。