Я использовал Grape для написания API, похожего на Evernote, и использовал Collection+JSON (тип MIME «application/vnd.collection+json»). Теперь я хочу также поддерживать JSON API (тип пантомимы «application/vnd.api+json»).
(Причина, по которой я хочу это сделать, заключается в том, что будет проще написать клиент Ember, поскольку Ember Data имеет встроенную поддержку JSON API. Возможно, для решения моей проблемы имеет смысл написать клиентский JavaScript, но я m сильнее в Ruby, чем в JavaScript.)
Моя цель состоит в том, чтобы сервер поддерживал любой формат и выбирал, какой из них основан на заголовке Accept. Это разумно, или нет смысла иметь несколько типов JSON? Похоже, что Grape не поддерживает это. Если у меня просто неправильное представление, то приведенный ниже код, вероятно, не имеет отношения к этому ответу.
Вот некоторые важные фрагменты кода моего сервера:
class NotesServer < Grape::API
content_type :json, ‘application/json’
content_type :json_api, 'application/vnd.api+json'
formatter :json_api, lambda { |object, env| object.to_json_api }
content_type :collection_json, 'application/vnd.collection+json'
formatter :collection_json, lambda { |object, env| object.to_collection_json }
resource :notes do
desc 'Get a note.'
params do
requires :id, type: Integer, desc: 'Note ID.'
end
route_param :id do
get do
NoteRepresenter.new Note.find(params[:id])
end
end
end
…где NoteRepresenter определяет как to_json_api, так и to_collection_json.
Идея состоит в том, чтобы использовать один и тот же представитель в любом случае, но вызывать соответствующий метод в зависимости от заголовка Accept.
Когда я запускаю curl для этого с любым заголовком Accept, ответ имеет Content-Type: application/json, а на репрезентаторе вызывается «to_json». Если я пропущу строку content_type :json, ‘application/json’
, я каждый раз получаю ответ 406 Not Acceptable.
Я выяснил, что в библиотеке Grape, в lib/grape/middleware/formatter.rb, "формат" запроса считается JSON для любого из этих типов MIME, так как части vnd.collection+ или vnd.api+ разбираются заголовка. Итак, мой вопрос: дело в том, что Грейп не поддерживает то, что я пытаюсь сделать, или я пытаюсь сделать что-то бессмысленное?
application/vnd.api+json
, а неapplication/json
? - person tadman   schedule 14.01.2015