有什么方法可以将值(如枚举)从前端(js)连接到后端(php/ruby)?

dan*_*aze 5 javascript php ruby code-design

给定后端基于 php 或 ruby​​ 的 Web 应用程序,并在前端使用 javascript 进行编程,有时我们需要在两侧定义值来处理通过 API 进行前端-后端通信的数据。

在javascript中会是这样的:

var options = {
        OPT_A : 1,
        OPT_B : 2,
        OPT_C : 3
    };

switch(data.type)
{
    case options.OPT_A:
        /* */
        break;
    case options.OPT_B:
        /* */
        break;
    case options.OPT_C:
        /* */
        break;
}
Run Code Online (Sandbox Code Playgroud)

在 php 中是这样的:

const OPT_A = 1;
const OPT_B = 2;
const OPT_C = 3;
Run Code Online (Sandbox Code Playgroud)

但问题是,你必须定义它们两次,每种语言一次。这可能会导致错误/不一致...

我想到的唯一方法是从服务器定义 javascript 部分,但我不喜欢 js 代码由 php/ruby 代码编写的想法。

所以我的问题是......有没有什么好的方法可以做到这一点?

Cer*_*eal 0

您将需要阅读有关网络服务的内容。Web 服务本质上是一种功能。你向它传递一些参数,它就会返回一些信息。通常用于允许程序访问外部数据。您几乎可以通过任何 API 查看它们的运行情况。有关示例,请参阅stackexchange 的 api 。

最小的例子:

#sinatra routing
get '/webservice/test' do
    content_type :json
    data = {options: {
        opt_a: 1,
        opt_b: 2,
        opt_c: 3
    }}
    JSON.pretty_generate(data)
end
Run Code Online (Sandbox Code Playgroud)

因此,当您访问 时your-site.com/webservice/test,您将得到:

{
  "options": {
    "opt_a": 1,
    "opt_b": 2,
    "opt_c": 3
  }
}
Run Code Online (Sandbox Code Playgroud)

在 javascript 中使用这些数据变得很简单:

var call = new XMLHttpRequest();
call.onreadystatechange = function() {
    if(call.readyState == XMLHttpRequest.DONE) {
        if(call.status == 200) {
            obj = JSON.parse(call.responseText);
            console.log(obj);
        } else if(xmlhttp.status == 400) {
            console.log("error 400");
        } else {
            alert("some other thing happened");
        }
    }
}
call.open("GET", "/webservice/test", true);
call.send(); 
Run Code Online (Sandbox Code Playgroud)

现在您的数据已经在客户端了!具体来说,objwill 是Object {options: Object},因此您可以使用 3 个选项来obj.options.opt_a获取1

这里有一些关于网络服务的很好的简单英语解释

如果您不熟悉 http 响应代码,可以在此处查看完整列表。这就是call.statusjavascript 代码的部分。

如果您愿意,您可以使用 jQuery 在 jQuery 中执行相同的 ajax 调用$.getJSON("/webservice/test", function() ...)。你可以在这里读更多关于它的内容