我目前正在为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
答案 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
)。