FOSRestBundle可以';t解析JSON
我对Symfony 3.2中的FOSRestBundle没有什么问题。首先,让我展示配置和操作: FOSRest形态:FOSRestBundle可以';t解析JSON,json,symfony,propel,fosrestbundle,symfony-3.2,Json,Symfony,Propel,Fosrestbundle,Symfony 3.2,我对Symfony 3.2中的FOSRestBundle没有什么问题。首先,让我展示配置和操作: FOSRest形态: fos_rest: versioning: true body_converter: enabled: true validate: true validation_errors_argument: validationErrors view: mime_types:
fos_rest:
versioning: true
body_converter:
enabled: true
validate: true
validation_errors_argument: validationErrors
view:
mime_types:
json: ['application/vnd.service_name+json; charset=UTF-8', 'application/json; charset=UTF-8', 'application/json']
param_fetcher_listener: true
body_listener:
decoders:
json: fos_rest.decoder.json
routing_loader:
default_format: json
format_listener:
enabled: true
serializer:
serialize_null: true
路由:
api_panel_external_address_services_get:
path: /addresses/{addressId}/services
methods: GET
defaults:
_controller: AppBundle:Api/ManagementPanel/External/Address:getServices
_format: json
requirements:
addressId: \d+
行动:
/**
* @ApiDoc(
* section="Panel/External",
* resource=true,
* description="Get external services",
* requirements={
* {"name"="addressId", "dataType"="string", "description"="External address id"}
* },
* statusCodes={
* 200="Returned when success",
* 400="Returned when data has errors (did not pass validation)",
* 404="Returned when address was not found",
* }
* )
*
* @ParamConverter("externalAddress", class="Company\Model\ExternalAddress", options={"mapping"={"addressId":"id"}})
*/
public function getServicesAction(ExternalAddress $externalAddress, ConstraintViolationListInterface $validationErrors): Response
{
if ($validationErrors->count())
{
$view = $this->view($validationErrors, Response::HTTP_BAD_REQUEST);
return $this->handleView($view);
}
$externalServices = $externalAddress->getExternalServices();
$services = [];
foreach ($externalServices as $externalService)
{
$services[] = [
'id' => $externalService->getId(),
'name' => $externalService->getName(),
];
}
return $this->handleView($this->view($services, Response::HTTP_OK));
}
问题:
当我转到route/api/v1/panel/external/addresses/801/services
时,在不同的环境中会出现不同的错误
邮递员:
(代码:400):无法解码JSON,语法错误-格式错误的JSON。
浏览器:
“code”:415,“message”:“不支持的媒体类型”,“异常”:[{“message”:“反序列化不支持格式\“\”。
但当我删除
,ConstraintViolationListInterface$validationErrors
及
从行动来看,一切都很好,我得到了JSON响应
我做错了什么吗?我想让这个$validationErrors
变量在FOSRestBundle文档中
希望我能得到一些帮助
好了,伙计们,我在代码中找到了答案。
这是http方法GET
,当我没有提供任何内容体(json)时出现错误。当您有GET
方法时,您应该从操作中删除$validationErrors
。
在我看来,如果$method==='GET'
,应该有签入FOSRestBundle。如果没有这一点,它会让人感到困惑,但仍然很有意义-当您的方法是GET
时,您不需要验证body
希望这将节省一些人的搜索时间
if ($validationErrors->count())
{
$view = $this->view($validationErrors, Response::HTTP_BAD_REQUEST);
return $this->handleView($view);
}