如何使用来自任何网络的不同端口访问api?

时间:2016-07-20 06:50:18

标签: javascript http port

在我的用例中,我在前端javascript中使用了一些api。这些api端点使用除端口80之外的不同端口号。

我的应用程序文件夹结构如下所示

app/
   view-events.js
   view.html

有两台服务器分别在端口80和8081上运行。 domain.com/view/ api将从80返回。view-events.js使用类似http://domain.com:8081/api/services/featured-data/的api。

因此,当我调用http://www.domain.com/view/时,页面会加载,但http://domain.com:8081/api/services/featured-data/中的组件未加载。这只发生在少数网络[主要是公司网络]。因为某些公司网络中不允许使用80以外的端口。

我该怎样摆脱这个问题?

有人可以帮我吗?感谢

2 个答案:

答案 0 :(得分:1)

执行此操作的常用方法是在端口80上运行某种反向代理(通常为ApachenginxHAProxy),并将请求路由到相应的api(因为只有一个服务可以在端口上运行,所以你的apis将运行例如8081,8082等...)。 (这是常见的设置,即使一个服务没有在端口80上运行,例如,您经常可以在8080上运行的Tomcat前面找到运行的Apache)。

Apache的示例.conf可以是:

dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.custom_dialog);
    dialog.show();


TextView tv_message = (TextView) dialog .findViewById(R.id.textViewMessage);

tv_message.setText(message);

Button bt_yes = (Button)dialog.findViewById(R.id.buttonYes);
   Button bt_no = (Button)dialog.findViewById(R.id.buttonNo);

bt_yes.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        CheckYes();
    }
});
bt_no.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        dialog.dismiss();
    }
});

以下是app和api [两台服务器]的示例nginx conf:

<VirtualHost *:80>
  ServerName example.com

  DocumentRoot /var/www/html/static-html-for-example.com-if-needed

  <Directory /var/www/html/static-html-for-example.com-if-needed>
    Options +Indexes
    Order allow,deny
    Allow from all
  </Directory>

  #LogLevel debug
  ErrorLog    logs/error_log
  CustomLog   logs/access_log common

  ProxyPass        /api1 http://127.0.0.1:8081/api1
  ProxyPassReverse /api1 http://127.0.0.1:8081/api1

  ProxyPass        /api2 http://127.0.0.1:8082/api2
  ProxyPassReverse /api2 http://127.0.0.1:8082/api2

  # backend api even does not have to be on the same server, it just has to be reachable from Apache
  ProxyPass        /api3 http://10.10.101.16:18009/api3
  ProxyPassReverse /api3 http://10.10.101.16:18009/api3
</VirtualHost>

答案 1 :(得分:0)

最佳解决方案是更改端口80中的api,只是为了安全起见。

如果没有,你可以通过jsonp解决这个问题。当您拨打8081 api时,您只需从网页进行跨域调用。

如果你决定使用jsonp,这里是详细解决方案。

How to make a JSONP request from Javascript without JQuery?

这很乏味,不建议你这样做。