AJAX 调用 API 算跨域吗?

Is AJAX Call to API Considered Cross Domain?

我正在 ajax 调用我自己域中的另一个页面。但是,在此页面上,我对 Etsy 的 API 进行了 API 调用。我得到 JSON 回来,将其格式化为 XML,然后 echo $xml 到 return 数据到原始 ajax 调用。但是,ajax.responseXML 始终为空! ajax.responseText 确实包含了我需要的所有信息。

如果不是 return 编辑 XML 格式的 JSON,我只是 return 一些 XML 没有那个数据,(比如... echo "<orders></orders>") 然后就可以了。并且 responseXML 不为空。

所以我在想,即使我的 ajax 调用正在调用我域中的另一个页面,因为该页面正在进行跨域调用 (Etsy API),它违反了单一来源政策,这就是为什么 responseXML 为 null?

调用如下:

var ajax = new XMLHttpRequest();
     ajax.open("GET", "OrderFetcher.php?function=sort");
     ajax.onreadystatechange = function () {
     if (ajax.readyState === 4) {

     if (ajax.responseXML === null) {
          console.log("ajax.responseXML is null.");
     }

     ordersToSort = convertXmlToArray(ajax.responseXML);

};
ajax.send();

OrderFetcher.php 包含 API 调用。

编辑

这是 php 代码 ajax 调用:

if (array_key_exists("function", $_GET)) {
if ($_GET["function"] === "sort") {

    header('Content-Type: text/xml');

    $fetchUrl = "https://openapi.etsy.com/v2/shops/__SELF__/receipts/open?limit=150&includes=Transactions,Listings";
    $orders = fetch(); // fetch() makes the API call via an Oauth object and oauth->fetch(...etc...etc...)

    $xml = "<orders>";

    foreach ($orders as $order) {
        $xml .= "<order>";
        $xml .= "<title>$order[title]</title>";
        $xml .= "<order_date>$order[order_date]</order_date>";
        $xml .= "<hidden_order_date>$order[hidden_order_date]</hidden_order_date>";
        $xml .= "<ship_date>$order[ship_date]</ship_date>";
        $xml .= "<addr_name>$order[addr_name]</addr_name>";
        $xml .= "<addr_line_1>$order[addr_line_1]</addr_line_1>";
        $xml .= "<addr_line_2>$order[addr_line_2]</addr_line_2>";
        $xml .= "<addr_city>$order[addr_city]</addr_city>";
        $xml .= "<addr_state>$order[addr_state]</addr_state>";
        $xml .= "<addr_zip>$order[addr_zip]</addr_zip>";
        $xml .= "<addr_country>$order[addr_country]</addr_country>";
        $xml .= "<price>$order[price]</price>";
        $xml .= "<quantity>$order[quantity]</quantity>";
        $xml .= "<message>$order[message]</message>";
        $xml .= "</order>";
    }

    $xml .= "</orders>";

    echo $xml;
}

我相信我已经将范围缩小到 API 调用或 ajax 超时。在上面的代码中,如果我注释掉 API 调用和 xml 数据,而只是执行下面的操作,它 "returns" 很好并且 ajax.responseXML 不为空。

if (array_key_exists("function", $_GET)) {
    if ($_GET["function"] === "sort") {

        header('Content-Type: text/xml');

        //$fetchUrl = "https://openapi.etsy.com/v2/shops/__SELF__/receipts/open?limit=150&includes=Transactions,Listings";
        //$orders = fetch();
        // Remove xml string building code.

        echo "<xmltag>Test</xmltag>";
     }
}

编辑 2

当我在我的浏览器中打开 "OrderFetcher.php?function=sort"(ajax 调用)时,它会运行几秒钟(进行 API 调用)然后给我这个:


此页面包含以下错误:

第 1 行第 1 列错误:文档为空 以下是第一个错误之前的页面呈现。


但是,我不相信 Etsy returning 导致无效 XML,因为我上面提到的这两点:

  1. 如果我忽略 API 数据(但仍然进行 API 调用)和 return 一个简单的 XML 字符串 (echo "<tag></tag>"),那么响应XML将仍然为空,即使我不是"echo-ing"来自API调用的任何数据。

这不起作用(ajax.responseXML 为空):

$orders = fetch();  
echo "<xmltag>Test</xmltag>";
  1. 如果我 return 简单的 XML 字符串 (echo "<tag></tag>") 但 完全删除 API 调用,突然responseXML 有效且不为空!

这个确实有效(ajax.responseXML不是 null):

//$orders = fetch();  
echo "<xmltag>Test</xmltag>";

哇,这只是一个菜鸟的错误。在我的 fetch() 函数(调用 API )中,我有一个 echo "something" 。因此,它在 echo $xml 之前执行导致我遇到的错误。