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,因为我上面提到的这两点:
- 如果我忽略 API 数据(但仍然进行 API 调用)和 return 一个简单的 XML 字符串 (
echo "<tag></tag>"
),那么响应XML将仍然为空,即使我不是"echo-ing"来自API调用的任何数据。
这不起作用(ajax.responseXML
为空):
$orders = fetch();
echo "<xmltag>Test</xmltag>";
- 如果我 return 简单的 XML 字符串 (
echo "<tag></tag>"
) 但 也 完全删除 API 调用,突然responseXML 有效且不为空!
这个确实有效(ajax.responseXML
是不是 null):
//$orders = fetch();
echo "<xmltag>Test</xmltag>";
哇,这只是一个菜鸟的错误。在我的 fetch()
函数(调用 API )中,我有一个 echo "something"
。因此,它在 echo $xml
之前执行导致我遇到的错误。
我正在 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,因为我上面提到的这两点:
- 如果我忽略 API 数据(但仍然进行 API 调用)和 return 一个简单的 XML 字符串 (
echo "<tag></tag>"
),那么响应XML将仍然为空,即使我不是"echo-ing"来自API调用的任何数据。
这不起作用(ajax.responseXML
为空):
$orders = fetch();
echo "<xmltag>Test</xmltag>";
- 如果我 return 简单的 XML 字符串 (
echo "<tag></tag>"
) 但 也 完全删除 API 调用,突然responseXML 有效且不为空!
这个确实有效(ajax.responseXML
是不是 null):
//$orders = fetch();
echo "<xmltag>Test</xmltag>";
哇,这只是一个菜鸟的错误。在我的 fetch()
函数(调用 API )中,我有一个 echo "something"
。因此,它在 echo $xml
之前执行导致我遇到的错误。