【问题标题】:SOLVED Laravel website returns "Error 404" for GET requests已解决 Laravel 网站为 GET 请求返回“错误 404”
【发布时间】:2020-05-04 21:49:14
【问题描述】:

所以我得到了一个 Flutter 应用程序的模板,该应用程序使用 HTTP get 请求从网站检索其所有数据。

我有以下获取餐厅列表的方法:

Future<Stream<Restaurant>> getNearRestaurants(LocationData myLocation, LocationData areaLocation) async {
  String _nearParams = '';
  String _orderLimitParam = '';
  if (myLocation != null && areaLocation != null) {
    _orderLimitParam = 'orderBy=area&limit=5';
    _nearParams = '&myLon=${myLocation.longitude}&myLat=${myLocation.latitude}&areaLon=${areaLocation.longitude}&areaLat=${areaLocation.latitude}';
  }
  final String url = '${GlobalConfiguration().getString('api_base_url')}restaurants?$_nearParams&$_orderLimitParam';
  final client = new http.Client();
  final streamedRest = await client.send(http.Request('get', Uri.parse(url)));

  return streamedRest.stream.transform(utf8.decoder).transform(json.decoder).map((data) => Helper.getData(data)).expand((data) => (data as List)).map((data) {
    return Restaurant.fromJSON(data);
  });
}

但是,当我将模板的 url 变量换成我自己的网站时,应用程序卡住了,streamRest 返回错误 404 页面。

尝试过的解决方案:

  • 我用 try/catch 块包围它,它没有给我任何例外。
  • 我还安装了邮递员并使用 GET 语句检查了我的网站,以获取我尝试在上面发布的颤振代码中检索的相同餐厅列表,并查看:Postman GET screenshot
  • 好像我的网站无法路由到我的 API 文件夹中的特定页面。但都是在 api.php 中定义的。

更新 1:

我的 web.php 看起来像这样https://pastebin.com/QRG300uL。它似乎类似于下面的建议

更新 2:

我运行了 php artisan route::list,它显示所有路由似乎都在那里:

|        | POST      | api/restaurant_reviews                                  | restaurant_reviews.store                 | App\Http\Controllers\API\RestaurantReviewAPIController@store                                   | api                                                  |
|        | GET|HEAD  | api/restaurant_reviews                                  | restaurant_reviews.index                 | App\Http\Controllers\API\RestaurantReviewAPIController@index                                   | api                                                  |
|        | GET|HEAD  | api/restaurant_reviews/create                           | restaurant_reviews.create                | App\Http\Controllers\API\RestaurantReviewAPIController@create                                  | api                                                  |
|        | DELETE    | api/restaurant_reviews/{restaurant_review}              | restaurant_reviews.destroy               | App\Http\Controllers\API\RestaurantReviewAPIController@destroy                                 | api                                                  |
|        | GET|HEAD  | api/restaurant_reviews/{restaurant_review}              | restaurant_reviews.show                  | App\Http\Controllers\API\RestaurantReviewAPIController@show                                    | api                                                  |
|        | PUT|PATCH | api/restaurant_reviews/{restaurant_review}              | restaurant_reviews.update                | App\Http\Controllers\API\RestaurantReviewAPIController@update                                  | api                                                  |
|        | GET|HEAD  | api/restaurant_reviews/{restaurant_review}/edit         | restaurant_reviews.edit                  | App\Http\Controllers\API\RestaurantReviewAPIController@edit                                    | api                                                  |
|        | GET|HEAD  | api/restaurants                                         | restaurants.index                        | App\Http\Controllers\API\RestaurantAPIController@index                                         | api                                                  |
|        | POST      | api/restaurants                                         | restaurants.store                        | App\Http\Controllers\API\RestaurantAPIController@store                                         | api                                                  |
|        | GET|HEAD  | api/restaurants/create                                  | restaurants.create                       | App\Http\Controllers\API\RestaurantAPIController@create                                        | api                                                  |
|        | GET|HEAD  | api/restaurants/{restaurant}                            | restaurants.show                         | App\Http\Controllers\API\RestaurantAPIController@show                                          | api                                                  |
|        | DELETE    | api/restaurants/{restaurant}                            | restaurants.destroy                      | App\Http\Controllers\API\RestaurantAPIController@destroy                                       | api                                                  |
|        | PUT|PATCH | api/restaurants/{restaurant}                            | restaurants.update                       | App\Http\Controllers\API\RestaurantAPIController@update                                        | api                                                  |
|        | GET|HEAD  | api/restaurants/{restaurant}/edit                       | restaurants.edit                         | App\Http\Controllers\API\RestaurantAPIController@edit                                          | api                                                  |
|        | POST      | api/send_reset_link_email                               |                                          | App\Http\Controllers\API\UserAPIController@sendResetLinkEmail                                  | api                                                  |
|        | GET|HEAD  | api/settings                                            |                                          | App\Http\Controllers\API\UserAPIController@settings                                            | api                                                  |

解决方案:

在更改了很多内容后,这对我有用,我将 GET 请求 URL 从“www.domain.com/api/resturants”更改为“www.domain.com/public/api/resturants”

【问题讨论】:

  • 你能运行一个 php artisan route:list 并在此处发布输出吗?
  • @FellipeSanches 已发布(更新 2)
  • Laravel 在生产中了吗?没有路线对我有用,这可能是网络服务器的问题,Apache / Ngix 也是...
  • 我不知道你有这么多路由,而且 API 似乎已经准备好了。请删除所有路由的链接,暴露在外有安全风险。
  • 简而言之,我建议将路线与 POSTMAN 一起使用,然后才去颤振。

标签: laravel routes


【解决方案1】:

嗯,我不知道你的颤振代码,因为我使用不同的方法从 api 检索数据,但我建议你像我一样做的路线

在 web.php 中的路由文件

//Api routes
Route::get('/company/api/fetch', 'ApiController@fetch_companies');

我的 api 控制器

public function fetch_companies()
{
    $companies = Companies::all();

    return response()->json($companies);
}

这样你会得到传递给路由 /company/api/fetch 的数据(你可以根据需要修改它),当一个 get 请求进入这个页面时它会返回 json

对于 flutter 方面的请求处理,我建议您将函数和类设置为 documentations

注意:我建议的颤振解决方案可能不适用于您的情况,因为您使用的是 Stream 这与此类请求不同,因为这种类型只运行一个,而 Stream 运行多次并在每次从服务器获取新数据时获取数据

【讨论】:

    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-09
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多