Symfony 4 / FosREST:API 路由返回 404 但不返回 Web 路由

哈姆

我正在建立一个多语言的经典 symfony 4.3 项目(又名网站),所有路线都可以。我想用一个简单的 API REST 公开一些数据(只有 3,4 条使用方法 GET 的路由),所以我安装了 FOSRestBundle 2.5。我知道这个版本与 SF 4.* 兼容。

问题是我的 API 路由返回所有 404 但不是“网络”路由。我阅读了 symfony doc 和 FOSREST doc 以及一些教程。在 fos_rest.yaml 中,我在rules参数中声明了两种类型的路由我已经在两个目录中分离了 web 控制器和 API 控制器(这两个目录都挂载在 services.yaml 中)

这里是 FOS REST 配置:config/packages/fos_rest.yaml

fos_rest:
    routing_loader:
        default_format: json
        include_format: false
    body_listener: true
    format_listener:
        rules:
            - { path: '^/api', priorities: [ json ], fallback_format: json, prefer_extension: false }
            - { path: '^/', priorities: [ 'html', '*/*'], fallback_format: ~, prefer_extension: true }
    param_fetcher_listener: true
    access_denied_listener:
        json: true
    view:
        view_response_listener: 'force'
        formats:
            json: true

配置/服务.yaml:

services:
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    App\ControllerApi\:
        resource: '../src/ControllerApi'
        tags: ['controller.service_arguments']

和注释定义:config/routes/annotations.yaml

# https://symfony.com/doc/current/routing.html#localized-routing-i18n
web_controllers:
    resource: ../../src/Controller/
    type: annotation
    prefix:
        en: /
        fr: /{_locale}
        de: /{_locale}
        es: /{_locale}
        pt: /{_locale}
    requirements:
        _locale: '%app_locales%'
    defaults:
        _locale: '%locale%'

# Controller for Rest API
rest_controller:
    resource: ../../src/ControllerApi/
    type: annotation
    prefix: /api

Web 控制器是基础和扩展AbstractController对于 API 控制器,这里有一个例子:

namespace App\ControllerApi;

use FOS\RestBundle\Controller\AbstractFOSRestController;
use FOS\RestBundle\Controller\Annotations as Rest;
use FOS\RestBundle\View\View;

final class fooApiController extends AbstractFOSRestController 
{
    /**
     * @param string $id
     *
     * @return View
     *
     * @Rest\Get("/demo/{$id}", name="api_demo")
     */
    public function getSimpleDataById($id)
    {
        /** @var Dso $dso */
        $data = $this->myCustomManager->getData($id);
        if (!$data instanceof CustomEntity) {
            throw new NotFoundHttpException();
        }

        return View::create($data, Response::HTTP_OK);
    }
}

这是生成的路由示例(带有主页的示例):

www-data@php:~/symfony$ php bin/console debug:router | grep home
  homepage.en                  ANY      ANY      ANY    /                                      
  homepage.fr                  ANY      ANY      ANY    /{_locale}/                            
  homepage.de                  ANY      ANY      ANY    /{_locale}/                            
  homepage.es                  ANY      ANY      ANY    /{_locale}/                            
  homepage.pt                  ANY      ANY      ANY    /{_locale}/   

一切正常(还有其他网络路由)。

这是API:

www-data@php:~/symfony$ php bin/console debug:router | grep api 
api_demo               GET      ANY      ANY    /api/demo/{$id}

所以我卷曲了两个:

curl --head http://symfony.local
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/7.2.14
Set-Cookie: PHPSESSID=336b94195892ebb5a3b4e7f2d2799fbb; path=/; HttpOnly; SameSite=lax
Cache-Control: max-age=0, must-revalidate, private, s-maxage=3600
Date: Fri, 19 Jul 2019 13:26:05 GMT
X-Debug-Token: 5653c7
# Works with others URL...

curl --head http://symfony.local/api/demo/m42
HTTP/1.1 404 Not Found
Server: nginx
Content-Type: application/json
Connection: keep-alive
X-Powered-By: PHP/7.2.14
Cache-Control: max-age=0, must-revalidate, private
Date: Fri, 19 Jul 2019 13:27:03 GMT

我没有发现错误。感谢阅读和回答

哈姆

我找到了一个起始解决方案。我已经更改了 fos_rest.yaml 上的配置:

fos_rest:
    routing_loader:
        default_format: json
        include_format: false
    body_listener: true
    format_listener:
        rules:
            - { path: '^/api', priorities: [ json ], fallback_format: json, prefer_extension: true }
    param_fetcher_listener: true
    access_denied_listener:
        json: true
    view:
        view_response_listener: true
        formats:
            json: true
    zone:
        - { path: ^/api/* }

我已经删除了规则 '^/' 并添加了区域。404 不在这里。

控制器中的注释也有错误:这是正确的语法:

/**
     * @Rest\View()
     * @Rest\Get("/demo/{id}", name="api_demo")
     *
     * @param string $id
     *
     * @return View
     */
    public function getSimpleDataById(string $id): View

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASP.NET Web API 5.2.3属性路由返回404

来自分类Dev

ASP.NET Web API 5.2.3属性路由返回404

来自分类Dev

静态路由返回404?

来自分类Dev

API 路由:未找到编辑返回 404

来自分类Dev

Symfony 4 - 如何为确实存在路由的 Web api REST 修复“404 Not Found”?

来自分类Dev

laravel Web路由返回404(无法找到控制器)

来自分类Dev

OData路由返回404 Not Found

来自分类Dev

Laravel基本路由返回404

来自分类Dev

Laravel基本路由返回404

来自分类Dev

快速路由返回 404 错误

来自分类Dev

找不到Web API路由404

来自分类Dev

404 未找到 Web API 路由

来自分类Dev

找不到htaccess路由返回404

来自分类Dev

节点子路由返回404

来自分类Dev

express.js 路由返回 404

来自分类Dev

注册的路由器 url 返回 404

来自分类Dev

Symfony2:FOSRest:允许“ / api / items”和“ api / items / {id}”的路由

来自分类Dev

API 路由不返回数据

来自分类Dev

symfony + fosrest:如何验证路由参数

来自分类Dev

使用路由约束时,如果路由参数验证失败,API为什么会返回404而不是400?

来自分类Dev

我的一些基于asp.net api属性的路由返回404(未找到)

来自分类Dev

我的ASP.NET Core WebAPI项目中的API路由不起作用,返回404错误

来自分类Dev

我的一些基于asp.net api属性的路由返回404(未找到)

来自分类Dev

Web API 2:OData 4:操作返回404

来自分类Dev

Web API 2 Odata V4 PATCH返回404

来自分类Dev

Asp.Net Mvc Web Api路由404

来自分类Dev

使用 '。' 使用属性路由的Web Api中出现404错误

来自分类Dev

具有多个参数的Web Api路由404ing

来自分类Dev

节点路由器.delete函数返回404找不到?