实现REST API Symfony 3
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现REST API Symfony 3相关的知识,希望对你有一定的参考价值。
我有一个现有的Symfony 3应用程序。我安装了FOSRestBundle,FOSUserBundle,NelmioCorsBundle。例如,我有2个实体:用户和关税。
关税具有id,名称,价格,描述,图像,用户(OneToMany to User)字段。用户有id,电子邮件,创建,更新,一些一对多字段,关税(ManyToOne to Tariff)。
我尝试创建User Rest Controller ::获取用户关税:
/**
* @RestGet(path="/users/{id}/tariff", name="get_user_tariff")
*
* @param $id
* @return Response
*/
public function getUserTariff($id)
{
/** @var User $user */
$user = $this->getDoctrine()->getRepository(User::class)->find($id);
$tariff = $this->getDoctrine()->getRepository(Tariff::class)->findBy(['id' => $user->getTariff()->getId()]);
$encoders = [new JsonEncoder()];
$normalizers = [new ObjectNormalizer()];
$serializer = new Serializer($normalizers, $encoders);
$response = new JsonResponse($serializer->serialize($tariff, 'json'));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
作为请求的结果,我有以下JSON:
"[{u0022idu0022:3,u0022nameu0022:u0022\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439u0022,u0022priceu0022:7900,u0022descriptionu0022:null,u0022leadMonthLimitu0022:3000,u0022statusu0022:100,u0022activeu0022:true,u0022comingSoonu0022:false,u0022imageu0022:u0022advanced.jpgu0022,u0022useru0022:null,u0022deletedu0022:false,u0022productu0022:{u0022nameu0022:u0022\u0410\u0431\u043e\u043d\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u043f\u043b\u0430\u0442\u0430 \u043f\u043e \u0442\u0430\u0440\u0438\u0444\u0443 \u00ab\u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439\u00bbu0022,u0022descriptionu0022:u0022\u0414\u0430\u043d\u043d\u044b\u0439 \u0442\u0430\u0440\u0438\u0444 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u043e 3000 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u0432 \u043c\u0435\u0441\u044f\u0446.u0022,u0022priceu0022:7900,u0022specialPriceu0022:null,u0022fiscalInfou0022:{u0022taxSystemu0022:null,u0022vatSystemu0022:null},u0022quantityu0022:1,u0022photou0022:u0022advanced.jpgu0022,u0022photoListu0022:[u0022advanced.jpgu0022]},u0022limitsDescriptionu0022:u0022\u0414\u0430\u043d\u043d\u044b\u0439 \u0442\u0430\u0440\u0438\u0444 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u043e 3000 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u043e\u0432 \u0432 \u043c\u0435\u0441\u044f\u0446.u0022,u0022ecommerceu0022:true,u0022modulesu0022:[u0022tariff.modules.ecommerceu0022],u0022__initializer__u0022:null,u0022__cloner__u0022:null,u0022__isInitialized__u0022:true}]"
(在db我有西里尔符号)。我可以修理它吗?
我的config.yml:
#FOSRestBundle
fos_rest:
body_listener: true
view:
view_response_listener: force
mime_types:
json: ['application/json; charset=UTF-8', 'application/json']
serializer:
serialize_null: true
body_converter:
enabled: true
format_listener:
rules:
- { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: true }
- { path: '^/', priorities: [ 'html', '*/*'], fallback_format: html, prefer_extension: true }
JsonResponse
将序列化你的数组,但它已经被Serializer
序列化了。您现在正在序列化已经序列化的对象。
使用setJson()
代替:
$response = new JsonResponse();
$response->setJson($serializer->serialize($tariff, 'json'));
看看SymfonyComponentHttpFoundationJsonResponse
它正在做什么。然后你会看到设置Content-Type
已经由JsonResponse::update
完成(从JsonResponse::setJson
调用)。
如果你使用JsonResponse($data)
或JsonResponse::setData()
,则会调用json_encode
。
以上是关于实现REST API Symfony 3的主要内容,如果未能解决你的问题,请参考以下文章
Symfony4 REST API (LexikJWTAuthenticationBundle) 的并发请求
Symfony2 Form + AngularJS for REST API = 表单验证额外字段错误
使用 Angular JS、cors 调用 symfony 2 rest api
401/405 错误 Symfony 4 REST:Docker 上的 JWT API 身份验证(LexikJWTAuthenticationBundle)-ngnix