XMLHTTPRequest 能否捕获表单数据,并将其发送到要发布的 PHP cURL 请求?

Can an XMLHTTPRequest capture form data, and be sent to a PHP cURL request to be posted?

我有一个 javascript 文件,它捕获表单输入,使用输入发出 XMLHTTP POST 请求,并处理错误。我目前正在 POST 访问一个单独的 PHP 文件,因为该请求需要敏感的 API 数据并且需要编码。然后我从 PHP 文件发送一个 cURL 请求到 post 表单输入到远程 URL.

我想根据 cURL 响应处理错误,但 XHR 错误不同并且优先于 cURL 错误。这两个请求都是必要的,还是我应该只发出一个 XHR 或 cURL 请求?

是否需要这两个请求取决于您的用例。既然你的听起来确实有必要,那绝对没有错。

您如何处理客户端的服务器端错误也完全取决于您。例如,让我们假设这个非常基本的 XHR 处理程序,它将一些 JSON 数据发送到某个端点并评估响应:

var xhr = new XMLHttpRequest();

xhr.open('POST', '/endpoint.php');
xhr.setRequestHeader('Content-Type', 'application/json');

xhr.onload = () => {

    const status   = xhr.status;
    const response = JSON.parse(xhr.responseText);
    
    if (status == 200) {

        // Everything's fine
        console.log(response.data);

    } else {

        // Some error occured
        console.log(status, response.data);
    }
};

xhr.send(JSON.stringify({}));

index.html

上述错误处理策略围绕从服务器接收到的 HTTP 状态代码展开,因此我们需要确保它们是根据我们的需要发送的:

/**
 * In case an error occurred, send an error response.
 */ 
function error(string $message) {

    // For properly returning a JSON response, see:
    // 
    header("Content-type: application/json; charset=utf-8");
    http_response_code(400); // HTTP status code - set to whatever code's appropriate

    echo json_encode(['data' => $message]);
}

/**
 * Send a response denoting a success.
 */ 
function success(array $data) {

    // For properly returning a JSON response, see:
    // 
    header("Content-type: application/json; charset=utf-8");
    http_response_code(200);

    echo json_encode(['data' => $data]);
}

// For proper error checking on JSON data, see:
// 
$data = json_decode(file_get_contents('php://input'), true);

// Assume some processing happened. That result is either
// a success, or an error.
$success = mt_rand(0,1);
$success ? success($data) : error('An error occured.');

endpoint.php

关于 cURL,您可以轻松地将最后两行更改为例如:

if(curl_errno($ch)) { // Assuming $ch is your cURL handle

    error('Curl error: '.curl_error($ch));
}
else {

    success($data);
}

或者您调整错误函数 - 如果它接受一个数组而不是一个简单的字符串,您将能够 return 更复杂的错误数据到您的 JavaScript 客户端:

$curl_error = curl_errno($ch);

if ($curl_error) {

    error([

        'type' => 'cURL', 
        'no' => curl_errno($ch), 
        'message' => curl_error($ch)
    ]);
}

不过,您不必坚持使用状态代码来处理错误。您可以发送一个 JSON 对象,其中一个键表示一些成功收集的数据,如果发生错误则表示错误。或者任何适合您的需求。