request.format返回* / *(request.format returning */*

2019-08-21 23:53发布

我目前正在开发用于我的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

Answer 1:

*/*意味着用户代理接受所有格式,并不在乎你给什么格式了。 我相信,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作为提示,如果客户没有明确说明。



Answer 2:

*/*只意味着所有MIME类型都可以接受。

综观为代码request.format方法中,MIME类型由文件扩展名来确定,或者,如果这不是由HTTP的值,则呈现Accept首部。 所以,你要么需要通过卷翘保存到磁盘上一个XML文件,或得到卷曲设置Accept头为XML MIME类型(例如text/xml ),当它发出请求到你的API。



文章来源: request.format returning */*