ruby - 构建 HTTP RESTful API(特定于 Ruby)

标签 ruby api http rest restful-url

我有一个充满信息的 mysql 模式,我想用 RESTful API 公开这些信息,最好是在 Ruby 中。

目前我所知道的

  • “RESTful”是指您的 API 遵循一定的标准,与任何特定的实现语言无关。
  • 我可以使用 Ruby 中的 mysql gem 从我的数据库中提取我需要的数据
  • Sinatra 项目似乎是一种使用 Ruby 设置 API 的简单方法

一个例子

假设我有一台服务器 (12.34.56.78),我在该服务器上的 ruby​​ 代码位于

/opt/example_code/main.rb. 

我希望用户能够查询类似的东西

12.34.56.77/customers/1234?show_ssn=true

为了检索客户 1234 的记录,选择同时显示 SSN

我不明白的地方

  1. 我需要运行哪些基本的服务器端软件才能做到这一点?我假设我需要某种始终运行的 Web 服务器,例如 Apache 或 nginx?我知道您可以在 python (python -m SimpleHTTPServer) 中运行一个简单的 HTTP 服务器,只要我的终端窗口打开(或者我取消它),它就会运行。 Apache 和 nginx 是否与此类似,但它们作为进程不断运行?

  2. 当用户点击 12.34.56.77 时,我如何让服务器知道它应该在 /opt/example_code 中查找我的脚本?我可以设置某种配置吗?

    我对 HTTP 端口的工作原理有一个模糊的概念;我应该将某些端口设置为“指向”某些目录吗?例如,只有当他们指定端口 5678 时,服务器才会知道正确查找我的 /opt/example_code 目录

    12.34.56.77:5678/customers/1234?show_ssn=true
    
  3. 当 HTTP 服务器最终破译请求并将其重定向到 /opt/example_code 时,接下来会发生什么?如何指示它运行该目录中的 main.rb 文件?此外,URI(“/customers...true”)如何传递到我的 ruby​​ 应用程序以供 Sinatra 破译?

我想我已经掌握了构成这个过程的各个部分,但我正在努力研究如何将它们整合在一起。

感谢您的帮助!

最佳答案

  1. 您需要运行网络服务器(Apache 或 Nginx)。每个请求都通过 Web 服务器。如果是对静态页面、某些 Assets 等的请求,Web 服务器将处理它。如果请求需要处理,它会被分派(dispatch)到应用服务器(thin、puma、unicorn...)。现在,Apache 或 Nginx 将被妖魔化,这意味着该进程将在后台运行,而不是在终端中运行。同样适用于您的应用程序服务器。您可以在线找到大量教程。另外一定要检查文档。

  2. 嗯,这真的取决于您的服务器。 Apache 和 Nginx 都有自己的方式来做到这一点。例如,通过为 Nginx 编辑启用站点的文件。但是再次选择一个并检查它的文档,您会在那里找到所有内容。

    关于端口:不,你不应该。服务器将知道在哪里寻找您的应用程序,因为它的配置。端口将允许您运行更多的服务器或进程。想象一下,您的应用程序服务器正在端口 3000 上运行。没有其他任何东西可以再使用该端口。这意味着,如果您想在同一台机器上运行例如 MySQL 服务器,则需要使用不同的端口。

  3. 您将配置您的网络服务器,以便它知道在哪里寻找引导文件。/customers 之类的路由将在您的 sinatra 应用程序中声明。看看这个http://recipes.sinatrarb.com/p/deployment/nginx_proxied_to_unicorn .

请注意,在没有深入了解服务器管理的情况下在生产环境中运行应用程序可能非常危险。很多事情都可能出错。也许一个好的解决方案是使用一些基于云的服务(Heroku、RackSpace...)?

我做了一些非常相似的事情。我用 Grape ( https://github.com/intridea/grape ) 编写了我的 API,它与 sinatra 非常相似,但它是专门为构建 API 而设计的。我使用 Nginx 作为我的网络服务器,使用 Puma ( https://github.com/puma/puma) 作为我的应用程序服务器。

祝你好运!

Nginx 配置示例(同一服务器上的两个服务)

/path/to/nginx/conf/sites-enabled/site1.com(将 nginx 与乘客一起使用):

server {
  listen 80;
  server_name site1.com;
}

server {
  listen 443;
  server_name site1.com;
  root /path/to/application/public-folder;
  passenger_enabled on;
}

/path/to/nginx/conf/sites-enabled/site2.com(使用带有 unicorn 和一些高级配置的 nginx):

server {
  listen 80;
  server_name site2.com;
}

server {
  listen 443;
  server_name site2.com;
  root /path/to/application/public-folder;

  client_max_body_size       10m;
  client_body_buffer_size    128k;

  proxy_connect_timeout      90;
  proxy_send_timeout         90;
  proxy_read_timeout         90;

  proxy_buffer_size          4k;
  proxy_buffers              4 32k;
  proxy_busy_buffers_size    64k;
  proxy_temp_file_write_size 64k;


  location / {
    proxy_set_header   Host $http_host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
    proxy_redirect off;

    proxy_pass http://unicorn_cluster;
  }
}

关于ruby - 构建 HTTP RESTful API(特定于 Ruby),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19601505/

相关文章:

ruby-on-rails - 无法在控制台 rails 中加载我的模型

ios - 使用 Swift 的 Twitter API 无效 URLRequestWithMethod

javascript - 使用 jquery 改进 json 解码

javascript - 如何在reactjs中连接登录API

ruby - 来自家庭 ISP 的 Google Analytics Garb 请求失败,但在其他地方有效

javascript - 使用 javascript 从 firebase 获取数据

java - Spotify Web Api token 请求响应 400

ruby-on-rails - NoMethodError,#<#<Class :0xbbb3ed0>:0xbbb34b0> 的未定义方法 `permits_path'

ruby-on-rails - 如何在单独的script.rb 中使用Rails 的Active Record?

ruby - Rust Vec 到带有 FFI 段错误的 Ruby 数组