Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
构建HTTP RESTful API(特定于Ruby)_Ruby_Api_Http_Rest_Restful Url - Fatal编程技术网

构建HTTP RESTful API(特定于Ruby)

构建HTTP RESTful API(特定于Ruby),ruby,api,http,rest,restful-url,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.

我有一个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

我不明白的事

  • 我需要运行什么基本的服务器端软件才能实现这一点?我想我需要某种web服务器,比如Apache或nginx,它总是在运行吗?我知道你可以用python运行一个简单的HTTP服务器(
    python-msimplehttpserver
    ),只要我的终端窗口打开(或者我取消它),它就可以运行。Apache和nginx是否类似于此,但它们作为一个进程持续运行

  • 当用户点击12.34.56.77时,我如何让服务器知道它应该在
    /opt/example\u code
    中查找我的脚本?有什么配置我可以设置吗

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

    12.34.56.77:5678/customers/1234?show_ssn=true
    
  • 当HTTP服务器最终解密请求并将其重定向到
    /opt/example\u code
    时,接下来会发生什么?如何指示它在该目录中运行我的
    main.rb
    文件?另外,如何将URI(“/customers…true”)传递到我的ruby应用程序,由Sinatra解密

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

    谢谢你的帮助

  • 您需要运行web服务器(Apache或Nginx)。每个请求都通过web服务器。若它是对静态页面、某些资产等的请求,web服务器将处理它。如果请求需要处理,它将被调度到应用服务器(瘦、彪马、独角兽……)。现在,Apache或Nginx将被妖魔化,这意味着进程将在后台运行,而不是在终端上运行。这同样适用于您的应用程序服务器。你可以在网上找到很多教程。还要确保检查文档

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

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

  • 您将配置web服务器,以便它知道在哪里查找引导文件。将在您的sinatra应用程序中声明/客户等路线。看看这个

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

    我做了一些非常相似的事情。我用Grape()编写了我的API,它与sinatra非常相似,但它是专门为构建API而设计的。我使用Nginx作为我的web服务器,Puma()作为我的应用服务器

    祝你好运

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

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

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


    非常有帮助,谢谢!我将浏览您列出的所有资源。如果可以的话,我可能会再问一两个小问题,但这对我来说是一个相当大的问题。非常感谢!实际上,我想到了一个问题——如果一台服务器要为各种服务提供多个API,该怎么办?所有这些的代码是否都必须在一个位置,或者配置是否允许根据请求的API资源(例如/客户/员工)指向不同的目录?您可以在一台服务器上、不同的位置拥有任意多个API。这与任何其他web应用程序的情况相同。一台服务器可以承载多个web应用程序。您需要对此进行配置。我编辑了我的答案,以显示此配置如何查找Nginx。
    server {
      listen 80;
      server_name site1.com;
    }
    
    server {
      listen 443;
      server_name site1.com;
      root /path/to/application/public-folder;
      passenger_enabled on;
    }
    
    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;
      }
    }