用 PHP Rest API 反应 axios,如何编写 baseurl [重复]
Posted
技术标签:
【中文标题】用 PHP Rest API 反应 axios,如何编写 baseurl [重复]【英文标题】:React axios with PHP Rest API , how to write the baseurl [duplicate] 【发布时间】:2021-02-05 10:09:32 【问题描述】:我正在做一个 ReactJS 前端应用程序并从使用 php Rest API 创建的 API 获取数据,但我的反应是托管在 localhost:3000 上,但我的 php 文件托管在 localhost:80 上。所以不知道如何在反应中编写baseurl,因为直到现在它总是出现一些错误。 我可以知道如何解决吗?谢谢。
错误:
Access to XMLHttpRequest at 'http://localhost/reacttest/src/api/read.php' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
xhr.js:184 GET http://localhost/reacttest/src/api/read.php net::ERR_FAILED
ReactJS:
import React from 'react';
// import logo from './logo.svg';
import './App.css';
import axios from "axios";
const baseUrl = "http://localhost:80/reacttest/src/api";
const sampleGet = async () =>
const result = await axios.get(baseUrl + "/read.php");
console.log(result);
;
const samplePost = async () =>
const result = await axios.post(baseUrl + "/posts",
sampleData: "nabezap"
);
console.log(result);
;
const sampleDelete = async () =>
const result = await axios.delete(baseUrl + "/posts/4");
console.log(result);
;
function App()
return (
<div className="App">
<button onClick=sampleGet>GET</button>
<button onClick=samplePost>POST</button>
<button onClick=sampleDelete>DELETE</button>
</div>
);
export default App;
read.php:
<?php
header('Content-Type: application/json;charset=utf-8');// all echo statements are json_encode
include('se.php');
include('db.php');
session_start();
$doctordb = new doctorModel; //instantiate database to start using
$result = $doctordb->showDoctorinfo();
if($result == false)
http_response_code(204); // no content
elseif(is_array($result))
http_response_code(200); //success
echo json_encode($result);
?>
api.php:
【问题讨论】:
您需要在您的 API 目录根目录下的 htaccess 文件中添加一个设置。见this solution 【参考方案1】:基本 url 是正确的(默认为 80),如果您在开发工具中检查您的网络选项卡,您会看到请求确实发出并收到了预期的响应。
问题在于您的 REST API。线索在错误中:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
这意味着服务器接收到请求,对其进行处理并返回响应——但它没有附加 Access-Control-Allow-Origin: ‘http://localhost:3000’
标头。当您的浏览器收到来自 API 的响应时,它会检查此标头并拒绝 javascript 访问响应数据,如果它丢失。这是正常的。
在您的 REST API 上设置 CORS 是可行的方法。您正在使用什么框架(如果有)?一旦我知道了,我会用更多信息编辑这个答案。
【讨论】:
谢谢 Nick,因为这是我学习 ReactJS 的第一天,只是测试如何使用 axios 获取/发布数据。所以我没有在前端使用任何框架,而在后端使用了 PHP REST API。我在上面添加了我的代码。 你用什么做后端?你能分享一些来自你的 REST API 的代码吗? 嗨尼克,我已经编辑了我的问题,PHP 代码是我的后端代码,文件名是 api.php(此文件中的所有 api,例如,如果我使用纯 javascript 获取数据,我会这样写:var url = './api/api.php?action=read';)。该文件包括我的 db.php(db 连接和查询)和 session.php。为了测试 reactJS,我添加了一个名为 read.php 的新文件,代码如上所示。 尝试将header("Access-Control-Allow-Origin: 'http://localhost:3000'");
添加到您的 api.php 中,就在您的其他标头声明下方。
谢谢尼克,我按照你的回答解决了问题。只需在 api 文件的开头添加这一行就可以了: header("Access-Control-Allow-Origin: *");再次感谢您。以上是关于用 PHP Rest API 反应 axios,如何编写 baseurl [重复]的主要内容,如果未能解决你的问题,请参考以下文章
已解决 - CORS、OPTIONS 和 PreFlight 问题 在 Vue.js 中使用 Axios 使用 REST API
带有 axios 的 firebase 身份验证 rest API 请求
使用 Axios 从前端访问 Django Rest API 时出现 Cors 错误