我正在使用 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 标头字段中给出的媒体类型指定。根据用户代理的格式和能力,可以自动选择最合适的选项。但是,本规范没有为这种自动选择定义任何标准。