是否使用406状态码(HTTP状态码)?

3

我正在使用Sinatra开发一个基于Ruby的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语句中应该做什么才最好。主要问题在于浏览器和jQuery AJAX将接受*/*,因此从技术上讲,406错误并不是最好的选择。但是:我应该发送什么?我可以使用data.to_s,但这没有意义。我可以发送HAML返回的内容,但他们没有要求text/html,我宁愿以某种方式通知他们。

其次,假设406代码是正确的方法,我如何格式化响应以符合W3规范?

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

1个回答

2
看起来您正在尝试使用一种清除所有可能返回的数据类型的方法,但这可能会使API的用户感到困惑。相反,他们应该知道特定URL始终会返回相同的数据类型。
对于我的内部REST API,我创建了某些URL以返回文档的HTML,其他URL则返回JSON格式的数据。如果用户混淆了它们,他们会在开发阶段时出现一些意外的数据,然后进行修复。
如果我必须使用像您所写的东西,并且它们无法处理“application/json”和“text/html”,那么我将返回“text/plain”并发送“data.to_s”,让他们解决问题。JSON和HTML现在已经成为非常成熟的标准。
您可以查看Sinatra响应头设置的文档。

看起来这是一个很好的答案。请注意,在服务器上,我可以完全实现在406错误时发生的情况,因此我可以发送一个text/plain格式的错误消息,而不是数据。这可能是最好的解决方案。您能告诉我如何构建响应以包括可接受类型的列表吗? - MarioDS
我建议您将答案回滚到先前的版本...如果406是错误的,那么405就更糟糕了,因为它涉及HTTP方法,例如GETPOST等... - MarioDS
回滚了。可接受类型的列表将成为一个标题,如果我没记错的话,Sinatra文档展示了如何创建额外的标题内容。 - the Tin Man
根据这个SO问题:http://stackoverflow.com/q/4422980/1313143 - 没有适当的头文件存在。显然,您应该只发送一个带有可接受类型的请求正文。我现在已经用text/plain完成了这个操作,就这样吧。感谢您的努力。 - MarioDS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接