php - 使用 Angular 应用程序访问 PHP API 时出现 CORS 和错误请求错误
问题描述
我正在尝试使用 http.post 从 Angular 7 应用程序调用用 PHP 编写的 API 端点。但是,我不断收到一个错误,这让我和另一位开发人员感到困惑。
错误是双重的。我收到一个 400(错误请求),然后是一个 CORS 错误,但此时我认为 CORS 错误是一个红鲱鱼。我认为错误的请求错误是问题所在,这可能与我提出请求的方式有关。
如果我用 Postman 调用端点,它就可以工作,我们创建了一个单独的 PHP 站点来尝试访问端点,并且工作正常。所以它显然是 Angular 代码。
这是 API 端点的 PHP 文件:
// required headers
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Access-Control-Max-Age: 3600");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
...
//get posted data
$data = json_decode(file_get_contents("php://input"));
if(!empty($data->searchby)){
$criteria = $data->searchby;
...
// set response code - 200 OK
http_response_code(200);
// show people data in json format
echo json_encode($people);
}
else{
// set response code - 404 Not found
http_response_code(404);
// tell the user no people found
echo json_encode(
array("message" => "No people found.")
);
}
}
// tell the user data is incomplete
else{
// set response code - 400 bad request
http_response_code(404);
// tell the user
echo json_encode(array("message" => "Failed - Missing Search Criteria", "data" => $data));
}
?>
这是调用端点的 Angular 代码:
let options = { headers: new HttpHeaders().set('Content-Type', 'application/json') };
let body = {
"searchby": "id",
"id": "2",
"email": " "
}
this.http.post(this.baseUrl + 'person/inq.php', body, options).subscribe(data => {
console.log(data);
})
}
我的猜测是问题与我如何通过请求正文或标头发送有关。我所知道的是,如果我有头发,我现在已经把它全部拔掉了。
解决方案
您没有遇到 POSTMan 错误的原因是,在 Angular 中,您正在执行 XHR (XMLHTTPREQUEST) 调用(基于 ajax),跨域之间不允许 XMLHTTPREQUEST (角度项目和 PHP 项目有不同的起源) . 所以需要在服务器端进行 CORS 配置。
抱歉,我将在.net core 中举一个例子。(需要 .net 核心的 cors nuget 包)。我相信您可以将此示例反映到 PHP 中:)
app.UseCors(x => x.AllowAnyHeader()
.AllowAnyMethod()
.WithOrigins("http://localhost:4200") //for development only (angular origin)
.AllowCredentials());
推荐阅读
- java - 在 prepareStatement 中使用 COALESCE 来“插入”cmd
- c# - 限制类实例化并将其封装在另一个类的属性中
- python - 在 Telethon 中查看已删除消息的文本或发件人
- django - 处理 django url 中的 html 特殊字符
- c# - 是否有读取整个控制台的功能?
- html - ul 元素在反应中没有定位在中心
- facebook - 如何使用 facebook 应用程序和 webhook 从多个 facebook 页面获取潜在客户?
- javascript - 通过使用 setInterval 动态改变值
- r - R ggplot 直方图组显示两组的总和
- mysql - 尝试在 mysql 中加入多个表 - 得到错误 1054,未知列