通过 AJAX 将 JSON 发送到 PHP 脚本
Sending JSON over AJAX to PHP script
我正在尝试创建一种获取 CSV 文件的方法,将其解析为 JSON,然后使用其 REST API 将其发送至 BigCommerce。最初我打算使用 Javascript 来完成整个事情,直到实际连接到 BigCommerce 以 PUT 数据工作为止。 BigCommerce 不允许 CORS,导致服务器返回 401 响应,我的数据实际被发送 none。正因为如此,我打算改用 PHP 来完成它,但是能够获得特定的 JSON 对象比使用 Javascript 困难得多。我想出的解决方案是解析 Javascript 中的数据,将其逐行发送到 PHP 脚本,然后 PHP 脚本将连接到 BigCommerce 和发给我。
首先,这可能吗?
这是我的一些 Javascript 代码:
$(document).ready(function () {
$('[type=file]').change(function () {
if (!("files" in this)) {
alert("File reading not supported in this browser");
}
var file = this.files && this.files[0];
if (!file) {
return;
}
i=0;
Papa.parse(file, {
delimiter: ",", // auto-detect
newline: "", // auto-detect
header: true,
dynamicTyping: true,
preview: 0,
encoding: "",
worker: false,
comments: false,
step: function(results, parser) {
console.log("Row data:", results.data);
console.log("Row errors:", results.errors);
currentID = results.data[i]["id"];
currentResult = results.data[i];
sendToBC(currentID, currentResult);
i+1;
},
complete: function(results, file) {
console.log("Parsing complete:", results, file);
$("#parsed_JSON").css("display", "block");
$("#ready_btn").css("display", "block");
$("#select_file").css("display", "none");
$("#retry_btn").css("display", "block");
},
error: function(error, file) {
console.log("Parsing failed:", error, file);
alert("Parsing failed. Check file and refresh to try again.");
},
download: false,
skipEmptyLines: true,
chunk: undefined,
fastMode: undefined,
beforeFirstChunk: undefined,
withCredentials: undefined
})
});
function sendToBC(id,data) {
jQuery.ajax({
type: "PUT",
url: "https://store.mybigcommerce.com/api/v2/products/" + id + "/discountrules.json",
data: data,
xhrFields: {
withCredentials: true
},
headers: {
'Authorization': 'Basic ' + btoa('username:key')
},
dataType:"json",
async: false,
success: function() {
alert("success")
},
error: function(xhr, status, error) {
console.log(error);
}
});
}
你会注意到我不得不在 papa 代码中间对 i=0 和 i+1 做一些奇怪的事情,但那是因为我不能在 step 函数中做一个 for 循环。
我的php只是基本的curl函数:
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $api_url );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array ('Accept: application/json', 'Content-Length: 0') );
curl_setopt( $ch, CURLOPT_VERBOSE, 0 );
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt( $ch, CURLOPT_USERPWD, "username:key" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $complete);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
$response = curl_exec( $ch );
curl_close ($ch)
我对 PHP 没有太多经验,尤其是通过 AJAX 将值传递给它,所以任何帮助都会很棒。我不太确定在文件之间传递值是如何真正起作用的,以及我如何以编程方式将这些数据发送到 PHP 的最佳方式。
谢谢。
考虑到您得到一个像 {"id": "77", "min": "1", "max": "6", "price": 10}
这样的字符串对象。并且您想从 JSON
对象中检索 ID (77
)。
$str = '{"id": "77", "min": "1", "max": "6", "price": 10}';
$jsonObj = json_decode($str);
$jsonObj->id; // the id.
这里 $jsonObj->id
是您可以调用您的 API 的 ID。
好吧,所以我最终的做法是使用 PHP 并使用通过键从数组中检索到的值自行构建一个 JSON 字符串。所以我做了:
contents[$i]['id']
获取当前项目的 ID 并将其存储在一个变量中,并对 csv 的所有其他列执行此操作。然后我构建了一个这样的字符串:
$jsonObject[] = '{"min": '.$min.',"max": '.$max.',"type": "'.$type.'","type_value": '.$value.'}';
并使用 CURL 通过 API 将其发送到 Bigcommerce。
我正在尝试创建一种获取 CSV 文件的方法,将其解析为 JSON,然后使用其 REST API 将其发送至 BigCommerce。最初我打算使用 Javascript 来完成整个事情,直到实际连接到 BigCommerce 以 PUT 数据工作为止。 BigCommerce 不允许 CORS,导致服务器返回 401 响应,我的数据实际被发送 none。正因为如此,我打算改用 PHP 来完成它,但是能够获得特定的 JSON 对象比使用 Javascript 困难得多。我想出的解决方案是解析 Javascript 中的数据,将其逐行发送到 PHP 脚本,然后 PHP 脚本将连接到 BigCommerce 和发给我。
首先,这可能吗?
这是我的一些 Javascript 代码:
$(document).ready(function () {
$('[type=file]').change(function () {
if (!("files" in this)) {
alert("File reading not supported in this browser");
}
var file = this.files && this.files[0];
if (!file) {
return;
}
i=0;
Papa.parse(file, {
delimiter: ",", // auto-detect
newline: "", // auto-detect
header: true,
dynamicTyping: true,
preview: 0,
encoding: "",
worker: false,
comments: false,
step: function(results, parser) {
console.log("Row data:", results.data);
console.log("Row errors:", results.errors);
currentID = results.data[i]["id"];
currentResult = results.data[i];
sendToBC(currentID, currentResult);
i+1;
},
complete: function(results, file) {
console.log("Parsing complete:", results, file);
$("#parsed_JSON").css("display", "block");
$("#ready_btn").css("display", "block");
$("#select_file").css("display", "none");
$("#retry_btn").css("display", "block");
},
error: function(error, file) {
console.log("Parsing failed:", error, file);
alert("Parsing failed. Check file and refresh to try again.");
},
download: false,
skipEmptyLines: true,
chunk: undefined,
fastMode: undefined,
beforeFirstChunk: undefined,
withCredentials: undefined
})
});
function sendToBC(id,data) {
jQuery.ajax({
type: "PUT",
url: "https://store.mybigcommerce.com/api/v2/products/" + id + "/discountrules.json",
data: data,
xhrFields: {
withCredentials: true
},
headers: {
'Authorization': 'Basic ' + btoa('username:key')
},
dataType:"json",
async: false,
success: function() {
alert("success")
},
error: function(xhr, status, error) {
console.log(error);
}
});
}
你会注意到我不得不在 papa 代码中间对 i=0 和 i+1 做一些奇怪的事情,但那是因为我不能在 step 函数中做一个 for 循环。
我的php只是基本的curl函数:
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $api_url );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array ('Accept: application/json', 'Content-Length: 0') );
curl_setopt( $ch, CURLOPT_VERBOSE, 0 );
curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
curl_setopt( $ch, CURLOPT_USERPWD, "username:key" );
curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 );
curl_setopt($ch, CURLOPT_POSTFIELDS, $complete);
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
$response = curl_exec( $ch );
curl_close ($ch)
我对 PHP 没有太多经验,尤其是通过 AJAX 将值传递给它,所以任何帮助都会很棒。我不太确定在文件之间传递值是如何真正起作用的,以及我如何以编程方式将这些数据发送到 PHP 的最佳方式。
谢谢。
考虑到您得到一个像 {"id": "77", "min": "1", "max": "6", "price": 10}
这样的字符串对象。并且您想从 JSON
对象中检索 ID (77
)。
$str = '{"id": "77", "min": "1", "max": "6", "price": 10}';
$jsonObj = json_decode($str);
$jsonObj->id; // the id.
这里 $jsonObj->id
是您可以调用您的 API 的 ID。
好吧,所以我最终的做法是使用 PHP 并使用通过键从数组中检索到的值自行构建一个 JSON 字符串。所以我做了:
contents[$i]['id']
获取当前项目的 ID 并将其存储在一个变量中,并对 csv 的所有其他列执行此操作。然后我构建了一个这样的字符串:
$jsonObject[] = '{"min": '.$min.',"max": '.$max.',"type": "'.$type.'","type_value": '.$value.'}';
并使用 CURL 通过 API 将其发送到 Bigcommerce。