如何为AJAX请求选择正确的dataType和contentType值?

时间:2017-09-09 17:07:32

标签: javascript php jquery ajax

我编写了一些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()错误,但页面实际上不会更新。

是否需要根据{app} / json'或contentType'text/plain; charset=utf-8'的值来不同地访问帖子数据?因为即使使用200响应代码,更新似乎也不会显示在网页上。

使用application/x-www-form-urlencoded; charset=UTF-8更新某些网页但会为其他网页带来403()错误。

1 个答案:

答案 0 :(得分:0)

作为Rory said (和我一样,在我写的答案中,当我看到他的评论时删除了;他的评论是正确的),403响应代码可能不会表示dataTypecontentType存在问题。您应该查找服务器拒绝满足请求的其他原因。例如,当您发布HTML时,也许您(或您的Web主机)正在进行某种反脚本注入保护。你必须跟踪它,可能是你的托管公司。

但有两件事:完整性的一些信息,以及潜在的解决方法:

dataType是您希望从服务器返回的类型。 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并解析它(阅读下面的代码来自this answer):

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

再次:请不要使用此,除非您拥有强大的防XSS安全措施。而且,如果您拥有强大的反XSS安全措施,您可以通过更改服务器配置来使用普通表单。