代码之家  ›  专栏  ›  技术社区  ›  JP Silvashy Gautam Rege

关于提出XHR请求的问题

  •  0
  • JP Silvashy Gautam Rege  · 技术社区  · 14 年前

    我不知道为什么,但是我还没有找到合适的资源来帮助我理解这里的最佳实践,但是假设我有一个应用程序,我想向另一个应用程序发出Ajax请求。

    www.example.com www.someapplication.com

    $.ajax({
      url: 'http://www.someapplication.com/items',
      dataType: 'json',
      data: "search=butter",
      success: function(data){
        console.log(data);
      }
    });
    

    http://www.someapplication.com/items?search=butter&format=json 然而 内容。

    http://www.someapplication.com/search.js ... 呃,我的概念出了什么问题,我是否遗漏了XSS和Ajax的一些重要内容?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Community CDub    7 年前

    在Nick的回答中,您将看到如何使用JSONP。我想给您添加一个建议,如何修改$.ajax代码,以查看 一个错误 内部 success jQuery $.ajax, error handler doesn't work . 可能是更改后jQuery中的错误 http://dev.jquery.com/changeset/6432 很快就会修好的。直到你能用的时候

    success: function(data, textStatus, xhr){
        if (xhr.readyState === 4 && xhr.status === 0) {
            alert('"error flag\" is true. It means that we have a network error '+
                  'or abortion (for example because of Same Origin Policy restrictions)');
        }
    },
    error: function(xhr, textStatus, errorThrown) {
        if (textStatus !== null) {
            alert("error: " + textStatus);
        } else if (errorThrown !== null) {
            alert("exception: " + errorThrown.message);
        } else {
            alert ("error");
        }
    }
    

    "exception: access denied" IE和中的错误

    "error flag" is true. It means that we have a network error or abortion
     (for example because of Same Origin Policy restrictions)
    

    如果出现同源策略错误,则在其他web浏览器中出错。

    顺便说一句,我回来了xhr.status=0如果同一来源策略错误,则不是200。

        2
  •  3
  •   Community CDub    4 年前

    这确实是由于同一原产地政策。如果您可以控制远程服务器,还可以添加HTTP Access-Control 服务器端的头。这样,您基本上可以从服务器端控制是否允许触发XMLHttpRequest的客户机处理响应。任何最近(和体面的)网络浏览器将采取相应的行动。

    header('Access-Control-Allow-Origin: *'); // Everone may process the response.
    header('Access-Control-Max-Age: 604800'); // Client may cache this for one week.
    header('Access-Control-Allow-Methods: GET, POST'); // Allowed request methods.
    

    关键是 Access-Control-Allow-Origin: * * (事实上,任何地方)都可以处理响应。如果你把它设为 Access-Control-Allow-Origin: http://example.com ,则webbrowser只能在从所述域提供初始页面时处理响应。

    另请参见:

        3
  •  1
  •   Nick Craver    14 年前

    same origin policy ,远程域需要支持 JSONP 为了工作,否则 XmlHttpRequest 阻止(由浏览器)看到内容。

    一旦设置完成,在jQuery中,您将通过设置 dataType option jsonp

    $.ajax({
      url: 'http://www.someapplication.com/items',
      dataType: 'jsonp',
      data: "search=butter",
      success: function(data){
        console.log(data);
      }
    });
    

    这将请求 完全 不同的方法,通过添加 <script> 元素…因此域必须支持JSONP,否则当响应返回时,您将看到一些语法错误。

        4
  •  1
  •   pepkin88    14 年前

    虽然还不能在所有浏览器中使用跨域XHR,但您可以使用简单的PHP文件创建网关:

    <?php
    echo file_get_contents($_GET['url']);
    ?>
    

    gateway.php?url=http://www.someapplication.com/items . 也许不是理想的解决方案,但它是有效的。

    编辑:

    <?php
    $urls = array();
    $urls[0] = 'http://www.someapplication.com/items';
    echo file_get_contents($urls[$_GET['id']]);
    ?>