Ruby 至406或不至406(http状态代码)

Ruby 至406或不至406(http状态代码),ruby,http,rest,sinatra,http-status-codes,Ruby,Http,Rest,Sinatra,Http Status Codes,我正在用Ruby和Sinatra开发一个RESTful web应用程序。它应该支持CRUD操作,为了响应读取请求,我有以下功能,可以根据请求指定的内容格式化数据: def handleResponse(data, haml_path, haml_locals) case true when request.accept.include?("application/json") #JSON requested return data.to_json when request.a

我正在用Ruby和Sinatra开发一个RESTful web应用程序。它应该支持CRUD操作,为了响应读取请求,我有以下功能,可以根据请求指定的内容格式化数据:

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
语句中最好做什么。主要问题是浏览器和jQueryAjax将接受
*/*
,因此从技术上讲,
406
错误并不是最好的主意。但是:我该送什么?我可以做
数据。这是毫无意义的。我可以发送HAML返回的内容,但他们没有要求
text/html
,我宁愿以某种方式通知他们

第二,假设
406
代码是正确的方法,我如何根据

除非是HEAD请求,否则响应应包括包含可用实体特征和位置列表的实体,用户或用户代理可从中选择最合适的实体。实体格式由内容类型标题字段中给定的媒体类型指定。根据用户代理的格式和能力,可以自动执行最合适的选择。然而,本规范并未定义此类自动选择的任何标准


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

对于我的内部RESTAPI,我创建了某些URL,这些URL返回HTML作为文档,其他URL返回JSON作为数据。如果用户跨越流,他们将在开发阶段这样做,他们将获得一些他们没有预料到的数据,并将修复这些数据

如果我不得不使用您正在编写的东西,而他们无法处理
'application/json'
'text/html'
,我会返回
'text/plain'
,并将
数据发送到_
,让他们整理这些乱七八糟的东西。JSON和HTML现在是相当成熟的标准



这是你的医生。

这看起来是个好答案。请注意,在服务器上,我可以完全实现406错误时发生的情况,因此我可以在
text/plain
中发送错误消息,而不是数据。这可能是最好的解决办法。你能告诉我应该如何构建响应以包括可接受类型的列表吗?我建议你将答案回滚到以前的版本。。。如果
406
是错误的,
405
更糟糕,因为它是关于HTTP方法的,例如
GET
POST
,等等…回滚。可接受类型的列表将是一个标题,如果我没记错的话,Sinatra文档将展示如何创建额外的标题内容。根据这个SO问题:-没有合适的标题存在。显然,您应该发送一个带有可接受类型的请求主体。我现在已经在
text/plain
中完成了这项工作,现在就到此为止。谢谢你的努力。