Apitte – request (Content-Type) – XML

rasstislav
Člen | 2
+
0
-

Ahojte,

pre API first prístup som sa rozhodol skúsiť použiť Apitte, čo sa mi zo začiatku javila ako skvelá voľba a stále dúfam, že nebudem musieť prejsť na niečo iné, avšak trápim sa so zapracovaním podpory aj pre XML.

Mám urobený vlastný XmlTransformer s využitím Symfony XmlEncoder, ktorý mi už pekne funguje pri response, avšak pri requeste (POST) sa vždy vyžadujú dáta vo formáte JSON (mapujem takto: #[Apitte\RequestBody(entity: UserRequest::class, required: true, description: 'Create a new user')]).
Je možné to nejako v tejto verzii ohnúť aby formát dát bol vyžadovaný na základe poskytnutého Content-Type? Prípadne je to v pláne?

Ďakujem

PS: @MarekBartoš @Felix Taktiež by bolo skvelým rozšírením, aby response bol na základe nastaveného Accept.
Niečo v tomto zmysle, ktorý by bol v tomto prípade zaradený medzi DefaultNegotiator a FallbackNegotiator.

<?php

declare(strict_types=1);

namespace App\Api\Negotiation;

use Apitte\Core\Http\ApiRequest;
use Apitte\Core\Http\ApiResponse;
use Apitte\Negotiation\INegotiator;
use Apitte\Negotiation\Transformer\ITransformer;

class AcceptNegotiator implements INegotiator
{
	/** @var ITransformer[] */
	private array $transformers = [];
	private array $types = [];

	/**
	 * @param ITransformer[] $transformers
	 */
	public function __construct(array $transformers, array $types)
	{
		$this->addTransformers($transformers);
		$this->types = $types;
	}

	/**
	 * @param mixed[] $context
	 */
	public function negotiate(ApiRequest $request, ApiResponse $response, array $context = []): ?ApiResponse
	{
		if (
			($accept = $request->getHeader('Accept')[0])
			&& ($type = $this->types[$accept] ?? null)
			&& ($transformer = $this->transformers[$type] ?? null)
		) {
			return $transformer->transform($request, $response, $context);
		}

		return null;
	}

	/**
	 * @param ITransformer[] $transformers
	 */
	private function addTransformers(array $transformers): void
	{
		foreach ($transformers as $suffix => $transformer) {
			$this->addTransformer($suffix, $transformer);
		}
	}

	private function addTransformer(string $suffix, ITransformer $transformer): void
	{
		$this->transformers[$suffix] = $transformer;
	}
}
Felix
Nette Core | 1245
+
0
-

Apitte bylo koncipovano, aby tohle presne slo. Ale dlouho jsem to nepouzil. Musim si najit cas a proverit to.