Axios.get 返回纯 html 而不是 JSON 返回数据

Posted

技术标签:

【中文标题】Axios.get 返回纯 html 而不是 JSON 返回数据【英文标题】:Axios.get returns plain html intead of JSON return data 【发布时间】:2020-04-11 18:06:08 【问题描述】:

我是响应 js 的新手,并尝试在 componentDidmount 时使用 axios.get 从数据库中获取数据。这是我试图获得产品的请求。我正在使用 laravel 的反应。

componentDidMount() 
        axios.get('http://localhost:8000/getproducts')
            .then(response => 
                console.log(response.data);
            );
    

在控制器中我正在返回数据

public function products()
    
       $products = Product::all();
       return response()->json($products);
    

axios.get 返回响应后,我得到以下纯 html

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <title>Learn React</title>

        <!-- Fonts -->
        <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
        <link href="http://localhost:8000/css/app.css" rel="stylesheet">
    </head>
    <body>
       <div id="crud-app"></div>

       <script src="http://localhost:8000/js/app.js"></script>
    </body>
</html>

Web.php

<?php


Route::get('any', function () 
    return view('welcome');
)->where('any','.*');

Route::get('/', function () 
    return view('welcome');
);

Route::post('save-product', 'ProductController@saveProduct')->name('save.product');
Route::get('getproducts', 'ProductController@products')->name('get.products');

【问题讨论】:

【参考方案1】:

将 api url 移动到 php 文件的顶部,最好添加 'api/' 作为前缀

<?php

Route::post('api/save-product', 'ProductController@saveProduct')->name('save.product');
Route::get('api/getproducts', 'ProductController@products')->name('get.products');


Route::get('any', function () 
    return view('welcome');
)->where('any','.*');

Route::get('/', function () 
    return view('welcome');
);

【讨论】:

为什么在路线低于之前它不起作用? 出现此问题是因为 php 文件从顶部逐行运行。因此,如果第一行说将所有请求转发到“欢迎”视图。然后它会这样做并返回。 在这种情况下返回视图欢迎路线的工作会正常吗? 是的,如果以上网址都不匹配。所以在这种情况下,欢迎视图成为后备视图【参考方案2】:
       axios.get(MyGlobleSetting.url + '/api/products')
       .then(response => 
         this.setState( products: response.data );
       )
       .catch(function (error) 
         console.log(error);
       )
     




render()
    return (
      <div>
        <h1>Products</h1>


        <div className="row">
          <div className="col-md-10"></div>
          <div className="col-md-2">
            <Link to="/add-item">Create Product</Link>
          </div>
        </div><br />


        <table className="table table-hover">
            <thead>
            <tr>
                <td>ID</td>
                <td>Product Title</td>
                <td>Product Body</td>
                <td >Actions</td>
            </tr>
            </thead>
            <tbody>
              this.tabRow()
            </tbody>
        </table>
    </div>
    )
  

export default DisplayProduct;

【讨论】:

【参考方案3】:

如果您使用 API 调用,则必须更改您的 URL,如下所示:

http://localhost:8000/api/getproducts

【讨论】:

我改变了,但它仍然得到相同的 html 你的 API 路由是什么? @ArslanAkram 我正在 web.php 中编写我的路线,这是我的路线 Route::get('getproducts', 'ProductController@products')->name('get.products');跨度> 当我将路由放入 routes/api.php 并像 localhost:8000/api/getproducts 这样调用路由时,我做了一些研究。它的工作原理是什么。为什么它在 web.php 中不起作用? 您使用的是 API 还是 WEB?前端和后端是相同的还是使用不同的平台? @ArslanAkram【参考方案4】:

这可能是您服务器的设置,因为 get 响应被定向到您的 react 应用程序而不是您的 api 端点。尝试将您的 api 托管在另一个端口上,并让 axios 请求该 url 端口。

【讨论】:

在 laravel 中我应该在哪里更改才能使其正常工作? 当我将路由放入 routes/api.php 并像 localhost:8000/api/getproducts 这样调用路由时,我做了一些研究。它的工作原理是什么……有什么问题? 这是因为 get 请求在到达您的 api 端点之前首先解析到 react 应用程序,因此像正常浏览一样返回 html 而不是 rest API 调用【参考方案5】:

在 Axios.get() HTTP 调用中传递附加设置

export const axiosConfig = 
    headers: 
        'Content-Type': 'application/json;charset=UTF-8',
        "Access-Control-Allow-Origin": "*",
        "APITOKEN": API_TOKEN
    
;

 axios.get('http://localhost:8000/getproducts',axiosConfig)
            .then(response => 
   console.log(response.data);
 );

【讨论】:

没有APITOKEN参数可以忽略。 好的,问题出在您的 laravel api 响应中。 我该怎么办? 公共功能 products() $products = Product::all(); return response()->json($products)->->header('Content-Type','application/json');试试这个希望这个解决方案有效。 当我将路由放入 routes/api.php 并像 localhost:8000/api/getproducts 这样调用路由时,我得到了一些研究。这是什么问题?

以上是关于Axios.get 返回纯 html 而不是 JSON 返回数据的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js:在axios.get之后使用方法返回图像

无法使用 api 从 axios 获取数据 - vue js

js axios发起get请求

执行带有axios的GET请求时出现401错误

Axios 获取请求返回 [代理代理] - Flask 和 Vue.js

用axios.get从静态目录加载json文件。