2013-10-26 41 views
3

我有一个mysql模式,里面充满了我想用RESTful API公开的信息,最好是在Ruby中。构建HTTP RESTful API(特定于Ruby)

我知道什么到目前为止

  • “REST风格”是指以下为API一定的标准,并且不与任何特定的实现语言相关。
  • 我可以使用Ruby的mysql的宝石拉,我从我的数据库
  • 的西纳特拉项目似乎是建立一个API使用Ruby

一个例子一个简单的方法所需要的数据

比方说,我有一台服务器(12.34.56.78)和服务器位于

/opt/example_code/main.rb. 

在我的Ruby代码,我想美国呃,以能够查询类似

12.34.56.77/customers/1234?show_ssn=true 

,以便检索客户1234的记录,选择加入也显示了SSN

我不明白

  1. 我需要运行哪些基本的服务器端软件才能实现此目的?我认为我需要某种Web服务器,比如Apache或者nginx,它总是在运行?我知道你可以在Python中运行一个简单的HTTP服务器(python -m SimpleHTTPServer),只要我的终端窗口打开(或者我取消它),它就会运行。 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
  1. 您需要运行Web服务器(Apache或Nginx)。每个请求都通过Web服务器。如果它是对静态页面,某些资产等的请求,则Web服务器将处理它。如果请求需要处理,它将被分派到应用程序服务器(瘦,美洲狮,独角兽等)。现在,Apache或Nginx将被妖魔化,这意味着该进程将在后台运行,而不是在终端中运行。同样适用于您的应用服务器。你可以在网上找到大量的教程。另外一定要检查文档。

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

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

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

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

我做了一件非常相似的事情。我在Grape中编写了我的API(https://github.com/intridea/grape),它与sinatra非常相似,但它是专门设计用于构建API的。我使用Nginx作为我的Web服务器和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的有麒麟和一些高级配置):

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

非常有帮助,谢谢!我将探索您列出的所有资源。如果没什么问题,我可能会回来一个小问题,但这可以让我开始。 非常感谢! – user2490003

+0

实际上有一个问题想起来 - 如果服务器有多个API用于各种服务,怎么样?所有代码都必须位于一个位置,还是配置允许根据请求的API资源(例如/ customer vs/employee)指向不同的目录? – user2490003

+0

您可以根据需要在一台服务器上的不同位置安装尽可能多的API。这与其他Web应用程序一样。一台服务器可以托管许多Web应用程序您将需要配置此。我编辑了我的答案,以显示此配置如何查找Nginx。 –