用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

与来自 api rest 的数据反应时渲染图形时出错

已解决 - CORS、OPTIONS 和 PreFlight 问题 在 Vue.js 中使用 Axios 使用 REST API

带有 axios 的 firebase 身份验证 rest API 请求

使用 Axios 从前端访问 Django Rest API 时出现 Cors 错误

如何在 Vuex 的操作中使用 axios 获取 Rest API 数据?

使用 JWT 访问 Rest API 适用于 Postman 但不适用于 Axios