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

4

1 回答 1

2

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

对于我的内部 REST API,我创建了某些返回 HTML 以获取文档的 URL,以及其他返回 JSON 以获取数据的 URL。如果用户跨过流,他们会在开发阶段这样做,他们会得到一些他们没有预料到的数据并会修复它。

如果我不得不使用像你正在写的东西,而他们无法处理'application/json'也无法处理'text/html',我会返回'text/plain'并发送data.to_s并让他们解决这个烂摊子。JSON 和 HTML 现在是相当成熟的标准。


这是Setting Sinatra response headers的文档。

于 2013-04-22T14:35:24.457 回答