如何在 Ruby 中将“Access-Control-Allow-Origin”标头添加到 API 响应

2024-05-13

我正在面试前端开发人员的工作,并接受了构建简单前端界面的编码测试。我已经得到了服务器,它是用 Ruby (2.1.3) 编写的,有 3 个端点,我将在前端客户端中使用它们。我对 Ruby 没有任何经验,但我按照他们的说明设置服务器,它似乎有效 - 我从所有端点收到响应。问题是我没有从我的客户端应用程序得到任何响应,该应用程序位于不同的“域”中(实际上,它们只是本地主机的不同端口)。看来他们没有在 API 上设置“Access-Control-Allow-Origin”标头,但我不想回到他们那里询问如何解决这个问题,因为我担心这会在我的测试中反映不佳。

下面是服务器文件结构,我还包含了一些似乎相关的文件的内容。如果有人想看其他文件,请评论。我确信这对于任何了解 Ruby 的人来说都很简单,但我没有最模糊的线索。

D:.
¦   .gitkeep
¦   client.rb
¦   config.ru
¦   foo.sqlite3
¦   Gemfile
¦   Gemfile.lock
¦   Rakefile
¦   README.md
¦
+---app
¦   +---controllers
¦   ¦       api_controller.rb
¦   ¦       application_controller.rb
¦   ¦       not_found_controller.rb
¦   ¦       payments_controller.rb
¦   ¦
¦   +---models
¦   ¦       payment.rb
¦   ¦
¦   +---views
¦           booking.html
¦           confirmation.html
¦
+---config
¦       boot.rb
¦       dispatcher.rb
¦
+---db
¦   ¦   schema.rb
¦   ¦   seeds.rb
¦   ¦
¦   +---migrate
¦           20150331094122_create_payments.rb
¦
+---lib
¦       my_application.rb
¦
+---log
¦       development.log
¦       test.log
¦
+---public
¦   ¦   404.html
¦   ¦   500.html
¦   ¦
¦   +---css
¦           style.css
¦
+---script
¦       console
¦       server
¦
+---spec
¦   ¦   spec_helper.rb
¦   ¦
¦   +---acceptance
¦   ¦       api_endpoint_spec.rb
¦   ¦       not_found_spec.rb
¦   ¦
¦   +---models
¦           payment_spec.rb
¦
+---vendor
    +---libs
            foobar_goodies

boot.rb

ENV['RACK_ENV'] ||= 'development'

# Bundler
require 'bundler/setup'
Bundler.require :default, ENV['RACK_ENV'].to_sym

require_relative '../lib/my_application.rb'

root_path = MyApplication.root
lib_path = File.join(MyApplication.root, 'lib')
app_path = File.join(MyApplication.root, 'app')
[root_path, lib_path, app_path].each { |path| $LOAD_PATH.unshift(path) }

ENV['PEERTRANSFER_ROOT'] = root_path

require 'config/dispatcher'
require 'sinatra/activerecord'

set :database, { adapter: "sqlite3", database: "foo.sqlite3" }

require 'app/models/payment'

my_application.rb

module MyApplication
  class << self
    def root
      File.dirname(__FILE__) + '/..'
    end

    def views_path
      root + '/app/views'
    end

    def public_folder
      root + '/public'
    end
  end
end

调度程序.rb

require 'controllers/application_controller'
require 'controllers/not_found_controller'

require 'controllers/api_controller'
require 'controllers/payments_controller'

module MyApplication
  class Dispatcher
    def call(env)
      path_info = env['PATH_INFO']

      app = case path_info
        when %r{^/api} then ApiController.new
        when %r{^/payment} then PaymentsController.new
        else NotFoundController.new
      end

      app.call(env)
    end
  end
end

应用程序控制器.rb

class ApplicationController < Sinatra::Base
  set :views, MyApplication.views_path
  set :public_folder, MyApplication.public_folder

  not_found do
    html_path = File.join(settings.public_folder, '404.html')
    File.read(html_path)
  end

  error do
    raise request.env['sinatra.error'] if self.class.test?

    File.read(File.join(settings.public_folder, '500.html'))
  end
end

api_endpoint_spec.rb

require 'spec_helper'
require 'models/payment'

describe 'API Endpoint' do
  it 'responds with a JSON welcoming message' do
    get '/api'

    expect(last_response.status).to eq(200)
    expect(last_response.body).to eq('{"message":"Hello Developer"}')
  end

  it 'returns all the stored payments' do
    Payment.all.map(&:delete)
    Payment.new(reference: 'any reference', amount: 10000).save

    get '/api/bookings'

    expect(last_response.status).to eq(200)
    expect(last_response.body).to eq("{\"bookings\":[{\"reference\":\"any reference\",\"amount\":10000,\"country_from\":null,\"sender_full_name\":null,\"sender_address\":null,\"school\":null,\"currency_from\":null,\"student_id\":null,\"email\":null}]}")
  end

  def app
    MyApplication::Dispatcher.new
  end
end

Sinatra 是一个简单且轻量级的 Web 服务器。一般的想法是,您可以像这样编写响应路由:

get '/api' do
 "Hello world"
end

当您向 yoursite.com/api 发出 HTTP GET 请求时,您将收到“Hello world”作为响应。

现在添加你想要的标题,这应该可以解决问题:

get '/api' do
  response['Access-Control-Allow-Origin'] = '*'
  "Hello world"
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ruby 中将“Access-Control-Allow-Origin”标头添加到 API 响应 的相关文章

随机推荐

  • 将启用的计算机添加到 Active Directory OU

    我正在尝试以编程方式将计算机添加到我公司的 Active Directory 我在互联网上搜索了很长时间 但找不到解决方案 My code DirectoryEntry dirEntry new DirectoryEntry LDAP OU
  • 哪个更快:堆栈分配或堆分配

    这个问题听起来可能相当简单 但这是我与另一位合作的开发人员进行的辩论 我小心翼翼地在可能的地方进行堆栈分配 而不是堆分配它们 他一边跟我说话 一边看着我 并评论说没有必要 因为他们的表现是一样的 我总是有这样的印象 堆栈的增长是恒定的时间
  • 查找矩阵内的匹配子矩阵

    我有一个 100x200 2D 数组 表示为由黑色 0 和白色 255 单元组成的 numpy 数组 它是一个位图文件 然后我有 2D 形状 最容易将它们视为字母 它们也是 2D 黑白单元格 我知道我可以天真地迭代矩阵 但这将是我的代码的
  • 为什么 RDF 中对对象使用代码而不是字符串?

    例如 entity f06574 rdfs label Orioles 或者这样的格式 tt0268252 a Movie 在任一情况下 f06574 and tt0268252是代码 而不是实体或实例的实际字符串 原因之一可能是因为同一个
  • 用掩码替换字符串模式的最快方法

    我有类似的字符串 string string key foo bar 和参数数组 params array foo gt 1 bar gt 2 如何以 string 模式替换此参数 预期结果是 string key 1 2 首先 您需要重写
  • StackExchange.Redis的正确使用方法

    这个想法是使用更少的连接和更好的性能 连接会随时过期吗 对于另一个问题 redis GetDatabase 打开新连接 private static ConnectionMultiplexer redis private static ID
  • 通过 Google Play 服务撤销驱动器访问权限

    有没有办法撤销通过 Google Play 服务授予的驱动器访问权限 参考这篇文章 https developer android com google auth api client html https developer androi
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • Docker 中的 NGINX 缓存 IP 地址并提供错误的 Content-Type

    Summary 我想让NGINX 不是NGINX Plus 通过使用变量从DNS名称重新解析IP地址proxy pass 如建议的这篇 Nginx 官方文章 在变量中设置域名 部分 https www nginx com blog dns
  • Laravel 资源策略始终为 false

    我试图允许用户在 Laravel 5 4 中查看自己的个人资料 用户策略 php public function view User authUser user return true 在 AuthServiceProvider php 中
  • 如何使用 PKAddPassButton 创建“添加到苹果钱包”按钮以进行本地化通行证

    在我的 iOS 项目中 我有一个屏幕 允许用户创建苹果通行证并将其添加到钱包中 Apple 建议使用 PKAddPassButton 创建 添加到苹果钱包 按钮 当我尝试使用以下代码创建苹果通行证时 let passButton PKAdd
  • 有没有一个工具可以自动追踪未使用的代码

    我目前有 6 个不同的 Flex 应用程序 小部件 在主页上运行 它们都依赖于一个公共库项目 我目前正在非常大幅度地清理代码库 并且很难以这种方式保持概览 特别是因为我继承了代码库 有谁知道有一个工具可以自动通知我任何死代码 Cheers
  • ElementTree 和 Element 有什么区别? (Python XML)

    from xml etree ElementTree import ElementTree Element SubElement dump elem Element 1 sub SubElement elem 2 tree ElementT
  • 读取并绘制从大文件中读取的数据

    我们有相当大的文件 大约为 1 1 5 GB 主要是日志文件 其中包含易于解析为 csv 的原始数据 随后应该将其绘制成图表以生成一组图形图像 目前 我们正在使用 bash 脚本将原始数据转换为 csv 文件 其中仅包含需要绘制图表的数字
  • Mockito:doAnswer 与 thenReturn

    我正在使用 Mockito 进行服务后期单元测试 我很困惑何时使用doAnswer vs thenReturn 谁能帮我详细一点吗 到目前为止 我已经尝试过thenReturn 你应该使用thenReturn or doReturn当您在模
  • 尝试使用适用于 Windows XP 的 Heroku 时未找到 msvcrt-ruby18.dll

    我有一个学生在 Windows XP 上进行开发 他在尝试运行时遇到了一个奇怪的错误heroku keys add 错误是 This application has failed to start because msvcrt ruby18
  • 当我在 Google Play 控制台上发布我的应用程序包时出现错误

    几天前 我在 Google Play Console 上发布了一个应用程序包 发现有关位置权限的错误 因此我填写了一份表格来解释为什么我们不在我的应用程序上使用该位置 但今天早上 他们给我发了一封电子邮件 说我的申请被拒绝了 邮件内容如下
  • 如何在我的 AWS EC2 实例上安装特定字体?

    我有一个在 AWS EC2 Amazon Linux Elastic Beanstalk 实例上运行的 Python 应用程序 该实例需要某些特定字体才能生成输出 并且想知道如何在部署或实例启动过程中安装它们 我的代码在本地计算机 OS X
  • 如何从 jQuery DataTable 中的所有页面中选择所有复选框

    我有 HTML 页面 其中有多个复选框 可以单独检查它们 我有 全选 当我单击此按钮时 所有复选框都应被选中 而当我再次单击同一按钮时 所有复选框都应被取消选中从所有页面 在我原来的程序中 有数千条记录 但一次显示 10 条记录 但是当用户
  • 如何在 Ruby 中将“Access-Control-Allow-Origin”标头添加到 API 响应

    我正在面试前端开发人员的工作 并接受了构建简单前端界面的编码测试 我已经得到了服务器 它是用 Ruby 2 1 3 编写的 有 3 个端点 我将在前端客户端中使用它们 我对 Ruby 没有任何经验 但我按照他们的说明设置服务器 它似乎有效