gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:43:38 25 4
gpt4 key购买 nike

在我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com