Ruby 至406或不至406(http状态代码)
我正在用Ruby和Sinatra开发一个RESTful web应用程序。它应该支持CRUD操作,为了响应读取请求,我有以下功能,可以根据请求指定的内容格式化数据: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
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
中完成了这项工作,现在就到此为止。谢谢你的努力。