到406或不到406(http状态代码)

时间:2013-04-22 14:16:28

标签: ruby http rest sinatra http-status-codes

我正在使用Sinatra在Ruby中开发RESTful Web应用程序。它应该支持CRUD操作,并且响应Read请求我有以下函数根据指定的请求格式化数据:

def handleResponse(data, haml_path, haml_locals)
  case true
  when request.accept.include?("application/json") #JSON requested
    return data.to_json
  when request.accept.include?("text/html") #HTML requested
    return haml(haml_path.to_sym, :locals => haml_locals, :layout => !request.xhr?)
  else # Unknown/unsupported type requested
    return 406 # Not acceptable
  end
end

只有我不知道在else声明中最好做什么。主要问题是浏览器和jQuery AJAX将接受*/*,因此技术上406错误并不是最好的主意。但是:我送什么?我可以做data.to_s这是毫无意义的。我可以发送HAML返回的内容,但他们没有要求text/html,我宁愿以某种方式通知他们。

其次,假设406代码是正确的方法,如何根据W3 spec将响应格式化为有效?

  

除非是HEAD请求,否则响应应该包括一个实体,其中包含可用实体特征和位置的列表,用户或用户代理可以从中选择最合适的实体特征和位置。实体格式由Content-Type头字段中给出的媒体类型指定。根据用户代理的格式和功能,可以自动选择最合适的选择。但是,该规范没有为这种自动选择定义任何标准。

1 个答案:

答案 0 :(得分:2)

看起来您正在尝试为可能返回的所有数据类型执行清算方法,但这可能会让API的用户感到困惑。相反,他们应该知道特定的URL将始终返回相同的数据类型。

对于我的内部REST API,我创建了某些返回HTML文档的URL,以及其他返回JSON数据的URL。如果用户跨越流,他们将在开发阶段执行此操作,他们将获得一些他们没有预料到的数据并将修复它。

如果我必须使用类似于您正在撰写的内容,并且无法处理'application/json'且无法处理'text/html',我会返回'text/plain'并发送{{ 1}}让他们理清一塌糊涂。 JSON和HTML现在已经很成熟了。


以下是Setting Sinatra response headers的文档。

相关问题