如何在jquery中调用外部url?

33

我正在尝试使用jQuery在Facebook上发布评论。

但我的ajax调用不允许外部网址。

有人能解释一下如何使用jQuery与外部网址吗?

以下是我的代码:

var fbUrl="https://graph.facebook.com/16453004404_481759124404/comments?access_token=my_token";

$.ajax({        
    url: fbURL ,
    data: "message="+commentdata,
    type: 'POST',
    success: function (resp) {
        alert(resp);
    },
    error: function(e){
        alert('Error: '+e);
    }  
});

它正在给出XMLHttpRequest错误。


1
你之所以会遇到这个错误,是因为该URL未通过“同源策略”,请参考http://en.wikipedia.org/wiki/Same_origin_policy。 - Ben Everard
7个回答

27

这些答案都是错误的!

正如我在评论中所说,你之所以会收到该错误是因为该URL未通过"同源策略",但你仍然可以使用AJAX函数来访问另一个域,请参见Nick Cravers类似问题的回答:

  

你需要通过在查询字符串上添加&callback=?来触发$.getJSON()的JSONP行为,像这样:

$.getJSON("http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&titles="+title+"&format=json&callback=?",
function(data) {
    doSomethingWith(data); 
}); 

你可以在这里进行测试。

如果不使用JSONP,就会遇到同源策略的问题,导致XmlHttpRequest无法获取任何返回数据。

考虑到这一点,以下代码应该可行:

var fbURL="https://graph.facebook.com/16453004404_481759124404/comments?access_token=my_token";

$.ajax({
    url: fbURL+"&callback=?",
    data: "message="+commentdata,
    type: 'POST',
    success: function (resp) {
        alert(resp);
    },
    error: function(e) {
        alert('Error: '+e);
    }  
});

$.getJSON 用于获取数据。在这里,我想要将数据发布到墙上。 - user319198
错误回调函数需要三个参数(不确定这是否是正确的术语),第一个是XHR,第二个是textStatus,第三个是errorThrown,请您弹出这些参数并告诉我们它们的含义。 - Ben Everard
因为它回答了原作者的问题? - Ben Everard

7

JQuery和PHP

在PHP文件"contenido.php"中:

<?php
$mURL = $_GET['url'];

echo file_get_contents($mURL);
?>

在HTML中:
<script type="text/javascript" src="js/jquery/jquery.min.js"></script>
<script type="text/javascript">
    function getContent(pUrl, pDivDestino){
        var mDivDestino = $('#'+pDivDestino);

        $.ajax({
            type : 'GET',
            url : 'contenido.php',
            dataType : 'html',
            data: {
                url : pUrl
            },
            success : function(data){                                               
                mDivDestino.html(data);
            }   
        });
    }
</script>

<a href="#" onclick="javascript:getContent('http://www.google.com/', 'contenido')">Get Google</a>
<div id="contenido"></div>

我已经编辑了你的答案,删除了你的签名。请参阅有关签名和标语的常见问题解答。http://stackoverflow.com/faq#signatures - Greg

3

这是跨站脚本攻击问题。现代常用浏览器不允许向其他网址发送请求。


13
你的意思是“同源策略”。 - karim79
@Andrei Andrushkevich,正确! 那么你有什么解决方法或变通方法吗? 我的意思是,如果要调用另一个特定的URL,应该怎么做? - HarsH

2

我认为唯一的方法是使用像MANOJ和Fernando建议的内部PHP代码。

在您的服务器上的PHP文件中进行curl post/get --> 使用ajax调用此php文件

假设PHP文件名为(fb.php):

$commentdata=$_GET['commentdata'];
$fbUrl="https://graph.facebook.com/16453004404_481759124404/comments?access_token=my_token";
curl_setopt($ch, CURLOPT_URL,$fbUrl);
curl_setopt($ch, CURLOPT_POST, 1);
// POST data here
curl_setopt($ch, CURLOPT_POSTFIELDS,
        "message=".$commentdata);

// receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec ($ch);
echo $server_output;
curl_close ($ch);

然后使用 AJAX GET 来

fb.php?commentmeta=your comment goes here

从您的服务器上执行此操作。

或者可以使用简单的HTML和JavaScript从外部服务器执行此操作:

Message: <input type="text" id="message">
<input type="submit" onclick='PostMessage()'>
<script>
function PostMessage() {
var comment = document.getElementById('message').value;
    window.location.assign('http://yourdomain.tld/fb.php?commentmeta='+comment)
}
</script>

1

搜索JavaScript同源策略

简而言之,您尝试使用的URL必须具有相同的根和协议。 因此, http://yoursite.com 无法访问 https://yoursite.comhttp://anothersite.com

如果您绝对必须绕过此保护(正如galimy所指出的那样,这是在浏览器级别上实现的),请考虑使用ProxyPass模块来配置您喜欢的Web服务器。


0

嗨,URL 应该调用一个函数,该函数将返回响应。

$.ajax({
url:'function to call url',
...
...

});

试着使用/调用Facebook的API方法


URL并不是问题,需要绕过同源策略。 - Samy S.Rathore

-1

按照以下简单步骤,您将能够获得结果

步骤1- 在后端创建一个内部函数getDetailFromExternal。 步骤2- 在该函数中使用 cUrl 调用外部 URL,如下所示:

 function getDetailFromExternal($p1,$p2) {

        $url = "http://request url with parameters";
        $ch = curl_init();
        curl_setopt_array($ch, array(
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => true            
        ));

        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $output = curl_exec($ch);
        curl_close($ch);
        echo $output;
        exit;
    }

步骤3- 通过使用JavaScript / jQuery Ajax从前端调用该内部函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接