request.format return * / *

时间:2009-10-20 15:21:15

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

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

2 个答案:

答案 0 :(得分:15)

*/*表示用户代理接受所有格式,并不关心您提供的格式。我相信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用作提示。

答案 1 :(得分:0)

*/*仅表示接受所有MIME类型。

查看request.format方法的代码,MIME类型由文件扩展名确定,或者如果不存在则由HTTP Accept标头的值确定。因此,您需要将Curl传递给保存到磁盘的XML文件,或者在向API发出请求时让Curl将Accept标头设置为XML MIME类型(例如text/xml)。