实现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 = 表单验证额外字段错误

API REST 的 symfony 5 自定义身份验证

使用 Angular JS、cors 调用 symfony 2 rest api

401/405 错误 Symfony 4 REST:Docker 上的 JWT API 身份验证(LexikJWTAuthenticationBundle)-ngnix

400错误代码,当使用RestTemplate进行Rest API时。