构建HTTP RESTful API(特定于Ruby)

时间:2013-10-26 00:36:29

标签: 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. 我需要运行哪些基本的服务器端软件来实现这一目标?我假设我需要某种类似Apache或nginx的Web服务器,它们一直在运行?我知道你可以在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破译?

  4. 我想我已经掌握了制作这个过程的各个部分,但我正在努力将它们整合在一起。

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  1. 您需要运行Web服务器(Apache或Nginx)。每个请求都通过Web服务器。如果是静态页面,某些资产等的请求,Web服务器将负责处理它。如果请求需要处理,它将被分派到应用程序服务器(thin,puma,unicorn ......)。现在,Apache或Nginx将被妖魔化,这意味着该进程将在后台运行,而不是在终端中运行。适用于您的应用程序服务器。你可以在网上找到很多教程。另请务必查看文档。

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

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

  3. 您将配置您的Web服务器,因此它知道在哪里查找bootstraping文件。像/ customers这样的路线将在你的sinatra应用程序中声明。看一下这个http://recipes.sinatrarb.com/p/deployment/nginx_proxied_to_unicorn

  4. 请注意,在没有深入了解服务器管理的情况下在生产中运行应用程序可能非常危险。很多事情都可能出错。也许一个好的解决方案是使用一些基于云的服务(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(使用nginx和unicorn以及一些高级配置):

    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;
      }
    }