Apitte – request (Content-Type) – XML
- rasstislav
- Člen | 2
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;
}
}