通过 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。