【问题标题】:ajax error using proxy and jsonp, suspect is url alteration使用代理和 jsonp 的 ajax 错误,怀疑是 url 更改
【发布时间】:2014-08-19 18:37:12
【问题描述】:

在 ajax 函数(第一个计时器)中没有得到我想要的内容,这似乎是因为 url 在发送时发生了变化,我不确定为什么或功能的哪一部分: ajax 函数在我的域上使用 proxy.php 来避免 Cross-Origin Request Blocked 错误。仅供参考,这是在 wordpress 网站中。我的proxy.php的内容是:

<?php
header('Content-type: application/json');
$url=$_GET['url'];
$json=file_get_contents($url);
echo $json;
echo $url; ?>

最后的echo $url; 用于测试 - 看看 url 地址发生了什么。

代理功能和目标url地址:

<button id="srch">Search</button>

<script>
$("#srch").click(function(){
  var url= 'https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=%22stones%22&gsrlimit=20&gsroffset=20&prop=imageinfo&iiprop=url&format=json&callback=?';
  var urlbackend = '../proxy.php?url='+url;
  $.ajax({
    url: urlbackend,
    data: { url: url },
    dataType: 'jsonp',
    success:  function () {
      alert ("success");
      console.log(data);
    }
  });
});

</script>

注意目标:https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=%22stones%22&gsrlimit=20&gsroffset=20&prop=imageinfo&iiprop=url&format=json&callback=?在浏览器中工作并生成我想要的 json 但是,ajax 失败(警报和 console.log 不触发)。

点击触发功能firebug控制台的按钮后,向以下地址显示GET请求: http://www.mysitename.com/proxy.php?url=https://commons.wikimedia.org/w/api.php?action=query&&callback=jQuery11110023817249378105143_1408472896266&url=https%3A%2F%2Fcommons.wikimedia.org%2Fw%2Fapi.php%3Faction%3Dquery%26%23038%3Bgenerator%3Dsearch%26%23038%3Bgsrnamespace%3D6%26%23038%3Bgsrsearch%3D%2522stones%2522%26%23038%3Bgsrlimit%3D20%26%23038%3Bgsroffset%3D20%26%23038%3Bprop%3Dimageinfo%26%23038%3Biiprop%3Durl%26%23038%3Bformat%3Djson%26%23038%3Bcallback%3D%3F&_=1408472896267

它得到的响应是 wikimedia 针对失败的 api 请求的默认 html 消息,其中包含我在关闭 &lt;/script&gt; 标记后放入 proxy.php 中的 echo $url。网址回显: https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=%22stones%22&gsrlimit=20&gsroffset=20&prop=imageinfo&iiprop=url&format=json&callback=?

这也与我原来的目标网址不同且不正确。 是什么导致了这些变化,我该如何解决? 为什么我在GET 网址中得到这个&amp;&amp;callback=jQuery11110023817249378105143_140847289626

【问题讨论】:

标签: jquery ajax json wordpress jsonp


【解决方案1】:

由于您通过代理 PHP 文件运行,因此您不需要使用 JSONP,因为它是从同一个域加载的。

您还需要escape() url 以便对其进行 URL 编码,因为您的值包含查询字符串。在不编码的情况下,这些属性将通过它们自己的键(例如action=query)传递给proxy.php,而不是将其作为用于查询远程源的url 参数的一部分。

var urlbackend = '../proxy.php?url=' + escape(url);

jQuery.click() 的使用已被弃用,取而代之的是 jQuery.on('click')

工作代码:

$("#srch").on('click',function(){
    var url= 'https://commons.wikimedia.org/w/api.php?action=query&generator=search&gsrnamespace=6&gsrsearch=%22stones%22&gsrlimit=20&gsroffset=20&prop=imageinfo&iiprop=url&format=json';
    var urlbackend = '../proxy.php?url='+escape(url);
    $.ajax({
        url: urlbackend,
        data: { url: url },
        success: function(response) {
          alert("success");
          console.log(response);
        }
    });
});

【讨论】:

  • 好主意,肯定会朝着正确的方向迈进,但仍然给我一个不起作用的网址。认为我应该通过将查询字符串与 url 分开来重试?
  • 我仔细看了看,您实际上有一些问题。如果您要通过代理运行它,那么您不需要使用JSONP,因为它是同一个域。我会用我测试过的一些工作代码来更新答案。
  • 不需要jsonp 的优点。仍然收到错误的网址。在这里找到答案:stackoverflow.com/questions/20503244/…
猜你喜欢
  • 2013-06-18
  • 2013-03-06
  • 2017-12-25
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多