我正在使用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头字段中给出的媒体类型指定。根据用户代理的格式和功能,可以自动选择最合适的选择。但是,该规范没有为这种自动选择定义任何标准。
答案 0 :(得分:2)
看起来您正在尝试为可能返回的所有数据类型执行清算方法,但这可能会让API的用户感到困惑。相反,他们应该知道特定的URL将始终返回相同的数据类型。
对于我的内部REST API,我创建了某些返回HTML文档的URL,以及其他返回JSON数据的URL。如果用户跨越流,他们将在开发阶段执行此操作,他们将获得一些他们没有预料到的数据并将修复它。
如果我必须使用类似于您正在撰写的内容,并且无法处理'application/json'
且无法处理'text/html'
,我会返回'text/plain'
并发送{{ 1}}让他们理清一塌糊涂。 JSON和HTML现在已经很成熟了。