JMS 序列化器运行时异常抛出 400 状态码
JMS serializer runtime exception to throw 400 status code
我正在使用 JMS 序列化程序,并且有两个字段,签入和签出作为具有特定格式的日期时间,如下所示:
/**
* @var \DateTime
* @Type("DateTime<'Y-m-d'>")
* @Assert\Date()
*/
protected $checkin;
/**
* @var \DateTime
* @Type("DateTime<'Y-m-d'>")
* @Assert\Date()
*/
protected $checkout;
现在,我想抛出 400 HTTP 状态代码,例如,如果有人发送无效格式(例如空字符串)。
问题是 JMS 序列化程序在无法从 DateHandler 中的格式创建日期时间时抛出 RuntimeException
,如下所示:
if (false === $datetime) {
throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format));
}
此异常给出了 500 HTTP 状态代码。
还检查了在配置中添加异常代码 400 的可能性,但问题是 JMS 在各种不同情况下都会抛出此类异常。
提前致谢!
这听起来像是您会使用 json-schema (PHP implementation) 之类的东西来验证用户提交的 JSON 而不是依赖 JMS 序列化程序的情况,正如其名称所暗示的那样,它纯粹是为了 de/serializing 内容而不是验证它。
作为权宜之计,您可以围绕反序列化执行 try/catch,然后手动 return 400 响应,例如
try {
$deserialized = $serializer->deserialize($content, My\Class, 'json');
} catch (\Exception $e) {
return new Response($e->getMessage(), 400);
}
尽管这可以解决您眼前的问题,但它并不是真正的最佳代码路径。在您的示例中,Symfony 本身正在捕获异常(因为它没有被您的代码捕获)并将其转换为 500 响应,JMS 序列化程序本身不能 return 400 响应。
我正在使用 JMS 序列化程序,并且有两个字段,签入和签出作为具有特定格式的日期时间,如下所示:
/**
* @var \DateTime
* @Type("DateTime<'Y-m-d'>")
* @Assert\Date()
*/
protected $checkin;
/**
* @var \DateTime
* @Type("DateTime<'Y-m-d'>")
* @Assert\Date()
*/
protected $checkout;
现在,我想抛出 400 HTTP 状态代码,例如,如果有人发送无效格式(例如空字符串)。
问题是 JMS 序列化程序在无法从 DateHandler 中的格式创建日期时间时抛出 RuntimeException
,如下所示:
if (false === $datetime) {
throw new RuntimeException(sprintf('Invalid datetime "%s", expected format %s.', $data, $format));
}
此异常给出了 500 HTTP 状态代码。
还检查了在配置中添加异常代码 400 的可能性,但问题是 JMS 在各种不同情况下都会抛出此类异常。
提前致谢!
这听起来像是您会使用 json-schema (PHP implementation) 之类的东西来验证用户提交的 JSON 而不是依赖 JMS 序列化程序的情况,正如其名称所暗示的那样,它纯粹是为了 de/serializing 内容而不是验证它。
作为权宜之计,您可以围绕反序列化执行 try/catch,然后手动 return 400 响应,例如
try {
$deserialized = $serializer->deserialize($content, My\Class, 'json');
} catch (\Exception $e) {
return new Response($e->getMessage(), 400);
}
尽管这可以解决您眼前的问题,但它并不是真正的最佳代码路径。在您的示例中,Symfony 本身正在捕获异常(因为它没有被您的代码捕获)并将其转换为 500 响应,JMS 序列化程序本身不能 return 400 响应。