【问题标题】:jQuery Ajax on Different Port不同端口上的 jQuery Ajax
【发布时间】:2023-04-07 15:10:01
【问题描述】:

我的 php 文件位于端口 80(默认端口),而我的 ajax 调用位于端口 8080。

我在 8080 端口上的 index.html

$(document).ready(function(){
$.get("userCheck.php", 
        {"username" : "lazy", "favcolor" : "FFFFFF" },          
        function(data){ alert("Data Loaded: " + data);
});

我的 PHP

$user = $_GET["username"];
if($user == "lazy")
    echo "SUCESS";
else
    echo "FAIL";

我在谷歌上搜索了一下,主要是 JSONP 出来的。知道如何将其转换为 JSONP 吗?

有什么办法让它工作?

【问题讨论】:

标签: php ajax


【解决方案1】:

您可以尝试使用端口号 (http://myserver:[port]/userCheck.php) 创建一个完整的 URL,但 它不起作用。 (Same origin policy)

在不同的端口上执行查询不是你应该使用 JSONP 的,因为任何好的 JSONP 框架都会阻止它(或者至少它应该)。允许这些东西不是 JSONP 的主要目标,它只是实现的副作用。

但是您可以在与index.html 相同的端口上创建一个“facade”PHP 脚本,然后执行对不同URL 的查询并返回值。这样浏览器就不知道真实的 URL。

index.html (8080) <--> myAjaxFacade.php (8080) <--> userCheck.php (80)

例如,为此,您可以使用 http-post-fields 函数。

示例:

$(document).ready(function(){
$.get("myAjaxFacade.php", 
    {"username" : "lazy", "favcolor" : "FFFFFF", 
     "realUrl": "http://serverwithdifferent:port/userCheck.php" },          
    function(data){ alert("Data Loaded: " + data);
});

myAjaxFacade.php 中,然后将所有其他 POST 数据转发到 $_POST['realUrl'] 并返回来自该 URL 的响应。

【讨论】:

  • 不行,因为我在 8080 - 8130 上大约有 50 个端口。这些端口来自外部源软件(不是 apache)。
  • 您可以只提供端口作为代理脚本的参数,您不必使用 50 个脚本 :)
  • 你能给我举个例子吗?我不知道该怎么做。谢谢。
  • 我在哪里存储 myAjaxFacade.php,对不起。
  • 在您的服务器上,index.html 所在的位置。
【解决方案2】:

由于same origin policy,您不能这样做。由于端口不同,因此将应用相同的来源策略并阻止您的 XHR 调用。

您必须使用代理来执行此类操作,您可以查看JsonP 或使用 curl 构建您自己的代理或将您的代码复制到同一端口上。

【讨论】:

    【解决方案3】:

    实现一个 JSONP 服务非常简单,你只需要一个 callback GET 参数,并在最后打印一个字符串,其中包含与 JSON 数据作为参数的函数调用等效的字符串:

    $callback = $_GET["callback"];
    $user = $_GET["username"];
    
    if($user == "lazy") {
      $response = array("message" => "SUCESS");
    } else {
      $response = array("message" => "FAIL");
    }
    
    echo $callback . "(". json_encode($response) . ");";
    

    然后你就可以和jQuery一起使用了$.getJSON:

    $.getJSON("jsonpTest.php?callback=?", { username: "lazy"}, function(json){
      alert("JSON Data: " + json.message); // SUCCESS
    });
    

    【讨论】:

      【解决方案4】:

      Same Origin Policy (SOP) 拒绝 Javascript 向任何其他主机和端口发送请求,而不是从它下载的主机和端口。

      解决这个问题需要一个程序在与将请求转发到实际服务的 javascript 的来源相同的主机和端口上运行。像这样运行的程序通常称为代理,因此需要一个JSONP 代理

      如果您的服务器正在运行 ruby/rails 和 sinatragithub.com/greenisus/jsonp-proxy 将是一个最小的解决方案。 PHP 似乎具有许多功能的解决方案是benalman.com/projects/php-simple-proxy/

      【讨论】:

        【解决方案5】:

        对于 PHP 上的 JSONP,请参见示例 here。您将“回调”参数添加到指定要运行的函数名称的 URL,并在您的 PHP 代码中确保发出 JavaScript,该调用是带有数据的回调。 jQuery 会在你的内容中注入一个脚本元素 - 当它运行时它会调用回调。

        【讨论】:

          【解决方案6】:

          部署“HAProxy”或“socat”可能是一种可行的解决方案。他们可以将请求重新路由到不同的端口。

          【讨论】:

            猜你喜欢
            • 2011-01-07
            • 1970-01-01
            • 2012-07-09
            • 1970-01-01
            • 2021-06-16
            • 1970-01-01
            • 1970-01-01
            • 2014-01-12
            • 1970-01-01
            相关资源
            最近更新 更多