提供的值无效(IRI 无效?) 测试 api 平台端点时出错

Posted

技术标签:

【中文标题】提供的值无效(IRI 无效?) 测试 api 平台端点时出错【英文标题】:Invalid value provided (invalid IRI?) Error testing api-platform endpoint 【发布时间】:2019-09-01 18:18:34 【问题描述】:

我有一个 Product 实体,它与另一个具有 manyToOne 关系的 User 实体相关

class Product implements AuthoredEntityInterface

/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="products")
* @ORM\JoinColumn(nullable=false)
*/
private $user;

/**
* @ORM\Column(type="string", length=255)
*/
private $name;

/**
* @ORM\Column(type="double")
*/
private $price;

//various getters and setters


AuthoredEntityInterface 有助于将用户设置为当前登录的用户。当我对 /api/products (我使用邮递员)进行 api 调用时,传递一个像这样的 json:


    "name": "my product",
    "price": 10

这行得通,并创建了一个新记录。问题在于单元测试。我这样打电话:

$headers = [
        'HTTP_AUTHORIZATION' => 'Bearer ' . $token,
        'CONTENT_TYPE' => 'application/ld+json',
        'HTTP_ACCEPT' => 'application/ld+json'
    ];
$postData = [
    'name' => 'my product',
    'price' => 10
];
$client = $this->makeClient();
    $client->request('POST', '/api/products', [], [], $headers, json_encode($postData));

我收到此错误: 提供的值无效(IRI 无效?)

现在唯一引用的 IRI 应该是用户,如上所述是在类中自动生成的。

有什么想法吗?

更新:

填充用户字段

产品中的方法

public function setUser(UserInterface $user): AuthoredEntityInterface

    $this->user = $user;
    return $this;

然后我使用事件订阅者:

class AuthoredEntitySubscriber implements EventSubscriberInterface

/** @var TokenStorageInterface */
private $tokenStorage;

public function __construct(TokenStorageInterface $tokenStorage)

    $this->tokenStorage = $tokenStorage;


public static function getSubscribedEvents()

    return [
        KernelEvents::VIEW => ['getAuthenticatedUser', EventPriorities::PRE_WRITE]
    ];


public function getAuthenticatedUser(GetResponseForControllerResultEvent $event)

    $entity = $event->getControllerResult();
    $method = $event->getRequest()->getMethod();

    /** @var UserInterface $user */
    $user = $this->tokenStorage->getToken()->getUser();

    if((!$entity instanceof AuthoredEntityInterface) || Request::METHOD_POST != $method) 
        return;
    

    $entity->setUser($user);


【问题讨论】:

你有 User 的 ID 属性吗?以及产品和用户的 getter/Setter ? 我在两个实体上都有 getter,不需要 setter,因为该字段是自动递增的 (@ORM\GeneratedValue()) 【参考方案1】:

我很确定您遇到了与我不久前相同的错误,身份验证凭据不应该在请求头中传递,它应该通过客户端传递。

示例:

$credentials = array(
    'HTTP_AUTHORIZATION' => 'Bearer ' . $token,
);

$client = $this->makeClient($credentials);

还要确保HTTP_AUTHORIZATION 是您需要使用的正确名称。很多时候只是授权。

回顾一下请求标头和客户端标头。确保您在客户端标头中设置身份验证。

【讨论】:

makeClient 应该收到一个包含用户名和密码的数组,或者什么都没有。在这里,我使用不记名令牌进行身份验证。无论如何,问题不在于身份验证:由于某种原因,我还不知道我的 AuthoredEntitySubscriber 仅在我使用 phpunit/Liip 时才被触发。 @user3174311 我同意,刚刚在我的堆栈上确认,您确实需要标头 Authorization 来发送不记名令牌,正如 Lulceltech 所建议的那样。没有找到令牌时不加载任何用户是有意义的。【参考方案2】:

您必须将您的$postData 编码为您想要的内容类型,例如。 JSON,编码数据必须传入$client->request()

【讨论】:

对不起,我错过了一点,$postData 已经是 json 编码的。我更新了问题。 如何将用户填写到您的产品中?可以展示部分代码吗? @user3174311 嗯,看起来不错,那么token呢,你确定是对的吗?是$user变量填入getAuthenticatedUser()调用吗? 您是否尝试在AuthoredEntitySubscriberfunction setUser 中记录$user。您是否在其他环境中运行测试?如果是,它们是否包含相同的用户数据? @ThomasVangelooven 我无法记录 $user 未执行 AuthoredEntitySubscriber,错误正是在我运行请求时。我将应用程序设置为在 sqlite 实例上运行测试,使用夹具正确设置数据。

以上是关于提供的值无效(IRI 无效?) 测试 api 平台端点时出错的主要内容,如果未能解决你的问题,请参考以下文章

为报告参数 '' 提供的值对其类型无效。 (rsReportParameterTypeMismatch)

VSTS测试结果更新API无效

web平台安装器 根级别上的数据无效.行1,位置1.

无法在 API Explorer 中测试方法 - 安全标头无效 - 10002 错误

Laravel 提供了无效的 MailChimp API 密钥

MailChimp 错误状态:401 标题:“API 密钥无效”