如何为AJAX请求选择正确的数据类型和ContentType值



我编写了一些jQuery PHP代码,该代码从网页上的元素中获取HTML并将其保存在服务器上。这是我使用的代码:

var page = {
    'html': document.querySelector("article").innerHTML,
    'url': 'path/current/webpage.php' or (<?php echo "'$current_page'"; ?>) 
    // Both give same 'url' value. This is not an issue. 
};
$.ajax({
    url:'https://example.com/update.php',
    type:'post',
    data: page,
    success:function(data){
        window.location.reload();
    }
});

这是我的update.php代码:

$content = $_REQUEST['html'];
$page = $_REQUEST['url'];
file_put_contents($page, $content, LOCK_EX);

我对dataTypecontentType不太满意,所以我最初跳过了。但是,该请求有时成功,但其他时间给出了403()错误。我进行了一些研究,发现这可能是由于缺乏dataTypecontentType。因此,我使用以下值:

contentType: 'text/plain; charset=utf-8',
dataType: 'html'

我不再遇到任何错误,但是页面实际上并没有更新。我还尝试将值设置为:

contentType:'application/json',
dataType: 'html'

这次,我没有得到任何403()错误,但页面实际上不会更新。

是否需要根据contentType的值(例如``Application/json''或 'text/plain; charset=utf-8'的值,需要以不同的方式访问帖子数据?因为即使有200个响应代码,更新似乎也不会显示在网页上。

使用application/x-www-form-urlencoded; charset=UTF-8更新了一些页面,但给出了403()错误。

正如罗里所说的(和我一样,在我看过他的评论时删除的答案一样;他是正确的评论),403回应代码可能并不意味着dataTypecontentType存在问题。您应该寻找服务器拒绝满足请求的其他原因。例如,当您发布HTML时,也许您(或您的Web主机)会进行某种反标记保护保护。您必须与您的托管公司一起跟踪。

但是有两件事:一些有关完整性的信息和潜在的解决方法:

dataType是您期望从服务器上 Back 的类型。contentType是您发送服务器的数据类型。

对于您要发送的请求,离开contentType是正确的,因为默认的jQuery将使用PHP期望看到的。

您不必完全指定dataType;相反,您应确保响应携带正确的Content-Type标头。这意味着确保正确配置您的服务器(对于静态内容),并确保您的PHP代码在必要时通过header("Content-Type: data/type-here")设置正确的标头,指定dataType的唯一原因是您不控制服务器并且您知道它会发送回错误类型。

如果您需要尝试解决它,请首先询问:如果有人直接向我发送恶意HTML,而不是通过我的网页?答案是:您需要小心您的内容使用HTML。例如:如果您要存储此HTML,然后向用户显示(作为HTML),那是一个跨站点的脚本漏洞,您必须在执行此操作之前严格地对该HTML进行严格消毒。

在您自己回答这个问题之前,请勿进行任何解决方法。

好吧,因此,就围绕它而工作的角度(一旦您拥有强大的保障措施):您可以发送JSON而不是标准表格,希望任何拒绝表格的东西都不会看它。为此,您会更改Ajax调用:

var page = {
    html: document.querySelector("article").innerHTML,
    url: <?php echo "'$current_page'"; ?>
};
$.ajax({
    url:'https://example.com/update.php',
    type:'post',
    data: JSON.stringify(page),
    contentType: 'application/json; charset=UTF8',
    success:function(data){
        window.location.reload();
    }
});

然后,在PHP一侧,您会读到JSON并解析它(以下从此答案中读取代码):

$entityBody = json_decode(stream_get_contents(STDIN));
$content = $entityBody['html'];
$page = $entityBody['url'];
file_put_contents($page, $content, LOCK_EX);

再次:请不要使用此,除非您有强大的反XSS保障措施。同样,如果您对HAEV进行了强大的反XSS保护措施,则可以通过更改服务器配置来使用正常表单。

最新更新