request.format return * / *

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

作为一个例子,我创建了一些XML,加载了创建对象所需的所有信息,让我们说一个Person,并使用Curl我将它提交给我的应用程序

我能够从控制器中调用我想要的创建操作,并正确传递对象的哈希参数

但是现在我需要应用不同的行为,如果请求是否与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发送一个*/*的Accept标头。

这是默认情况下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文件传递给Curl,或者在向API发出请求时让Curl将Accept标头设置为XML MIME类型(例如text/xml )。