【发布时间】:2021-07-03 07:40:57
【问题描述】:
我在PHP 中创建了自己的restful 应用程序,它将API 公开给javascript 应用程序。除非我在响应头中插入http_response_code,否则一切都很顺利。
下面是我用来打印 json 格式数据的函数。我根据需要使用的错误代码(200、404、400、401 等)设置了http_response_code()。
<?php
public function handle($code = 200, $data = array())
{
$message = json_encode(
array(
"code" => $code,
"data" => $data
), JSON_PRETTY_PRINT
);
http_response_code($code);
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
header('Content-type: text/javascript; charset=utf-8');
print_r($message);
exit;
}
前端,我使用jQuery 进行简单的Ajax 调用。我认为它不需要任何解释,但为了完整起见,我把它放在了这里。
$.ajax({
url: url,
method: method,
cache: false,
headers: headers,
data: data,
crossDomain: true,
success: function(data){
console.log(data)
},
error: function (xhr, ajaxOptions, thrownError) {
console.log((xhr.responseJSON)
}
});
问题是这样的。如果在 PHP 脚本中我注释行 http_response_code($code); 一切正常,但我总是收到状态码 200。
如果我尝试更改状态代码,无论是 200 还是任何其他代码,客户端都会响应以下错误:
Access to XMLHttpRequest at 'MY API URL CENSORED' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
正如你所看到的php 和js 方面我已经启用了跨域并启用了所有跨域。我真的不明白为什么它会给我这个错误,除非我添加这一行http_response_code($code)。
我做错了吗?更改状态代码是否会对 cors 策略产生任何问题?
【问题讨论】:
-
史蒂夫 - 你的
$.ajax电话中的headers是什么? -
header('Content-type: text/javascript; charset=utf-8'); print_r($message);没有意义。你输出的是 JSON,而不是 JavaScript ……print_r用于输出复杂的数据结构而不是简单的字符串。 -
crossDomain: true,抑制了 jQuery 添加到同源请求的功能,因此当同源请求被重定向到不同源时,它们不会导致问题。这几乎总是毫无意义的。
标签: javascript php rest cors