Я создал свой собственный 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}} — это переменная, указывающая на домен Shopware (например: shop-example.com)
Вы делаете запрос к витрине, а не к конечной точке 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`
На самом деле ваша проблема заключается в вашем контроллере, вы используете область маршрута 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\"
Пожалуйста, убедитесь, что ваш плагин с этим контроллером установлен и активен, и очистите кеш после изменения имени маршрута, так как symfony тщательно кэширует все доступные маршруты, чтобы сопоставлять маршруты эффективным способом.
Кроме того, убедитесь, что вы правильно настроили route.xml, чтобы symfony действительно обращался к вашему контроллеру при поиске аннотаций маршрута, обратитесь к документации здесь: developer.shopware.com/docs/guides/plugins/plugins/storefron т/…
Какое значение имеет {{ baseUrl }}?