Shopware 6: Как заставить работать мой собственный запрос в Postman с помощью Admin API

Я создал свой собственный API запросов ( POST : {{baseUrl}}/products/create ). Этот API используется для создания многих продуктов и возвращает только общее количество существующих продуктов в Shopware. Я хочу выполнить свой запрос в почтальоне, но не могу. Есть ли способ заставить работать запрос в Postman?

Апиконтроллер.php

<?php declare(strict_types=1);

namespace TestApi\Controller\Api;

use Shopware\Core\Framework\Context;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Shopware\Core\Framework\Routing\Annotation\RouteScope;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

/**
 * @RouteScope(scopes = {"api"})
 */
class ApiController extends AbstractController
{
    protected EntityRepositoryInterface $productRepository;

    public function __construct(EntityRepositoryInterface $productRepository)
    {
        $this->productRepository = $productRepository;
    }
    /**
     * @Route("/products/create", name = "api.product.create", methods = {"POST"})
     */
    public function createProducts(Context $context): JsonResponse
    {
        $this->productRepository->create([
            [
                'name' => 'Product 1',
                'productNumber' => 'SW1231',
                'stock' => 10,
                'taxId' => 'bc3f1ba6f75749c79b5b4a9d673cf9d4',
                'price' => [['currencyId' => Defaults::CURRENCY, 'gross' => 50, 'net' => 25, 'linked' => false]],
            ],[
                'name' => 'Product 2',
                'productNumber' => 'SW1232',
                'stock' => 10,
                'taxId' => 'bc3f1ba6f75749c79b5b4a9d673cf9d4',
                'price' => [['currencyId' => Defaults::CURRENCY, 'gross' => 50, 'net' => 25, 'linked' => false]],
            ]
        ], $context);

        $criteria = new Criteria();
        $products = $this->productRepository->search($criteria, $context);

        return new JsonResponse($products->count());
    }
}

Почтальон:

Для информации я предоставил заголовок Authorization в запросе.

Какое значение имеет {{ baseUrl }}?

Marcus 10.01.2023 11:32

{{baseUrl}} — это переменная, указывающая на домен Shopware (например: shop-example.com)

SMS 10.01.2023 11:35
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как создать простое погодное приложение на Python с API OpenWeatherMap
Как создать простое погодное приложение на Python с API OpenWeatherMap
Этот учебник проведет вас через процесс создания простого погодного приложения с помощью Python и OpenWeatherMap API.
Пакеты Java
Пакеты Java
Пакет java - это группа классов, интерфейсов и подпакетов схожего типа. Думайте об этом как о папке в каталоге файлов. Мы используем пакеты, чтобы...
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
Как использовать API парсинга квитанций с помощью JavaScript за 5 минут?
В этом руководстве вы узнаете, как использовать API парсинга квитанций за 5 минут с помощью JavaScript. Eden AI предоставляет простой и удобный для...
Как использовать get bounds с react-leaflet и данными JSON
Как использовать get bounds с react-leaflet и данными JSON
Я считаю, что получить границы из библиотеки leaflet Js очень просто, но использование этой функции может быть немного сложным. Поэтому позвольте мне...
1
2
100
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы делаете запрос к витрине, а не к конечной точке API. Защита от CSRF вступает в игру только на витрине. В вашем baseUrl отсутствует префикс /api? Значение должно быть похоже на http://localhost/api.

Я внес некоторые изменения, такие как @Route("/api/products/create", name = "api.product.create", methods = {"POST"}) . Я проверил запрос в Postman и получил эту ошибку: «Не найден маршрут для POST shop-example.com/api/products/create`

SMS 10.01.2023 12:08
Ответ принят как подходящий

На самом деле ваша проблема заключается в вашем контроллере, вы используете область маршрута api, что означает, что должен использоваться механизм аутентификации api. Но все маршруты с областью маршрута api должны начинаться с префикса /api в пути.

Маршруты без префикса /api или /store-api считаются запросами витрины с авторизацией витрины. Вы также должны получить сообщение об ошибке из-за несоответствия области маршрута и фактического пути API, но, вероятно, ошибка CSRF возникает до того, как это будет проверено.

Чтобы исправить свой код, используйте /api/products/create в качестве пути для вашего пользовательского действия контроллера, а также используйте префикс /api в почтальоне для доступа к вашему маршруту.

Я исправил маршрут к @Route("/api/products/create", name = "api.product.create", methods = {"POST"}) и проверил этот запрос в почтальоне https://shop-example.com/api/products/create, но снова получаю следующую ошибку: "No route found for \"POST https://shop-example.com/api/products/create\"

SMS 10.01.2023 12:05

Пожалуйста, убедитесь, что ваш плагин с этим контроллером установлен и активен, и очистите кеш после изменения имени маршрута, так как symfony тщательно кэширует все доступные маршруты, чтобы сопоставлять маршруты эффективным способом.

j_elfering 10.01.2023 13:28

Кроме того, убедитесь, что вы правильно настроили route.xml, чтобы symfony действительно обращался к вашему контроллеру при поиске аннотаций маршрута, обратитесь к документации здесь: developer.shopware.com/docs/guides/plugins/plugins/storefron‌ т/…

j_elfering 10.01.2023 13:30

Другие вопросы по теме