我认为互联网上有很多类似的主题,但我只花了1小时的搜索,仍然无法解决这个问题。
我无法使用Angular在我的服务器(Apache和PHP)上发出POST请求。
我使用angular / cli v.6.2.1和节点10,apache 2.4和php 7.1
这是一个来自Http调用的简单代码(HttpClient和HttpHeaders都来自@ angular / common / http):
constructor(private http: HttpClient){}
this.http.post('http://localhost/distributor.php', ['prop1':'value1', 'prop2':'value2'], {headers: new HttpHeaders().set('Access-Control-Allow-Origin','*')}).subscribe(
data => {
console.log(data);
},
err => {
console.log('error');
});
}
我只是尝试以这种方式从PHP发回一些东西:
<?php
$data = $_POST;
echo json_encode($data);
我已经允许apache配置文件中的所有来源。在“OPTIONS”预检之后,Firefox和Chrome都让我失望,不做任何其他事情,没有从PHP文件返回。
以下是FireFox向我展示的内容:
我可以在网络标签中看到这个:
响应选项卡显示一个完全空的框。
我可以从我的http.post中删除自定义标题的部分,它不会改变任何内容。
对我来说似乎很奇怪的是,我可以点击FireFox编辑并重新发送按钮,而不会改变任何内容,并显示正确的结果......
感谢您的阅读/帮助
首先,您需要修复POST数据;你有Object语法的方括号。
const data = { 'prop1': 'value1', 'prop2': 'value2' };
this.http.post('http://localhost/distributor.php', data).subscribe(
reply => {
console.log(reply);
},
err => {
console.log('error', err);
});
接下来,您需要添加适当的标头并设置PHP以处理JSON:
<?php
header('Access-Control-Allow-Headers: Access-Control-Allow-Origin, Content-Type');
header('Access-Control-Allow-Origin: *');
header('Content-Type: application/json, charset=utf-8');
// grab JSON data sent by Angular
$data = json_decode(file_get_contents('php://input'), true);
// add numeric data
$data["prop3"] = 3;
// reply
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK);
这对我有用。
我有同样的问题,但通过将这些行添加到您的PHP代码解决了
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: X-Requested-With');
header('Access-Control-Allow-Methods: POST, GET, OPTIONS');
header('Content-Type: application/json');
let data = {
'prop1': 'value1',
'prop2': 'value2'
};
return this.http.post('http://localhost/distributor.php', data, {headers: new HttpHeaders().set('Access-Control-Allow-Origin', '*')}).map((response: Response) => {
let data = response;
if (data) {
console.log(data);
}
})