ruby-on-rails - 在 ROR 中为 JSON 处理函数添加 XML 支持

标签 ruby-on-rails json ruby xml heroku

在我的 heroku RoR 应用程序中,我有一个支持 JSON 请求的 Controller 。我有以下功能:

def mssg_as_json
    @message = Message.new
    @message.text = params.require(:messages)
    @message.save
    string = "http://link.com/" 
    @message.url = string + @message.id.to_s
    @message.save
    render json: { url: @message[:url] }
end

def return_mssg_as_json
  if @message = Message.find_by(id: params[:id])
    render json: { message: @message[:text] }
  else
    render json: {errors: :not_found}, status: :not_found
  end
end

我也想支持 XML 请求。我的想法是以某种方式将 XML 转换为 JSON,但我不知道如何。如何修改代码以同时支持 XML 和 JSON?

附言 我的路线是:

get "messages/api" => "messages#return_mssg_as_json"
post "messages/api" => "messages#mssg_as_json"

请求被发送到 main_url/messages/api

最佳答案

因此,您应该利用标准路线和操作。在 routes.rb 中,您可以执行如下操作:

Rails.application.routes.draw do
  resources :messages     
  namespace :api, defaults: {format: 'json'} do
    namespace :v1 do
      resources :messages
    end
  end
end

请注意,您的 Controller 现在嵌套在 api/v1 中。这允许您将路径标识为 api 并随着时间的推移维护版本。那扎实的做法。另请注意,您的 Web 应用程序有一个标准的 messages 资源。

然后,您的 Controller 将如下所示:

class Api::V1::MessagesController < Api::V1::BaseController

  def create
    @message = Message.new(message_params)
    respond_to do |format|
      if @message.save
        @message.update(url: "http://link.com/#{@message.id}")
        format.json { render json: create_hsh, status: :ok }
        format.xml  { render xml: create_hsh, staus: :ok }
      else
        format.json { render json: @message.errors, status: :unprocessable_entity }
        format.xml  { render xml:  @message.errors, status: :unprocessable_entity }
      end
    end
  end

  def show 
    respond_to do |format|
      if @message = Message.find_by(id: params[:id])
        format.json { render json: show_hsh, status: :ok }
        format.xml  { render xml: show_hsh, status: :ok }
      else
        format.json { render json: {errors: :not_found}, status: :not_found }
        format.xml  { render xml: {errors: :not_found}, status: :not_found } 
      end
    end
  end

private

  def create_hsh
    @message.attributes.with_indifferent_access.slice(:url)
  end

  def show_hsh
    attr = @message.attributes.with_indifferent_access
    attr.slice(:foo, :bar).merge!(message: attr[:text])
  end

  def message_params
    params.require(:message).permit(:text)
  end

end

请注意,此 Controller 继承自 Api::V1::BaseController。那将是您设置的 Controller ,用于执行与 api 相关的客户端身份验证( key / token 检查等)。可能是这样的:

class Api::V1::BaseController < ActionController::API
  before_action :authorize

  def authorize
    # do your checks in a way that results in a variable @authorized?
    render(json: {errors: :unauthorized}, status: :unauthorized) unless @authorized?
  end

end

因此,现在您使用单个 Controller 操作来响应所有格式类型(您选择提供)。然后,您的客户会发布如下内容:

http://your.api.com/messages.json

获取 json 响应。或者:

http://your.api.com/messages.xml 

获取 xml 响应。您可能会注意到以下内容:namespace :api, defaults: {format: 'json'} do。这意味着您的客户可以调用:

http://your.api.com/messages

它会默认为 json 格式。

现在您没有一堆随机端点(如 mssg_as_json),只有您的客户期望的常规 RESTful 端点。您的 API 客户会因此爱上您。

您会注意到 show_hsh 是您先前问题中的已接受代码。

关于ruby-on-rails - 在 ROR 中为 JSON 处理函数添加 XML 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47102754/

相关文章:

ruby-on-rails - rspec 测试模型的最小值和最大值

javascript - 如何使用 Dropzone.js 和 Rails 4 重定向提交页面?

ruby-on-rails - 错误 406,远程 : true Ajax form is still causing a redirect

mysql - Ruby 1.9.3 上的 Rails 2.3 编码错误

ruby-on-rails - 基于条件渲染,rails

javascript - Rails 仅在 current_user logged_in 时执行 javascript

javascript - 当我在 jQuery 中执行 AJAX 调用时出现 JSON 错误

jquery - 服务器不支持 JSONP 时的跨域请求

javascript - JS - 用 html 解析 JSON

ruby - 匹配ruby中的正则表达式