Formatowanie danych

Format danych decyduje o sposobie w jaki treść wiadomości HTTP powinna być skomponowana lub przetworzona, w szczególności w jaki sposób yii\httpclient\Message::$data powinna być przekonwertowana na yii\httpclient\Message::$content i vice versa.

Domyślnie wspierane są poniższe typy formatowania:

Każdy format składa się z dwóch jednostek: 'formatera' i 'parsera'. Formater ustala w jaki sposób treść żądania powinna zostać skomponowana z podanych danych. Parser ustala w jaki sposób surowa treść odpowiedzi powinna być przetworzona na dane.

yii\httpclient\Client automatycznie wybiera odpowiedni formater i parser dla wszystkich powyższcyh tyów formatowania, ale można wpłynąć na ten mechanizm za pomocą yii\httpclient\Client::$formatters i yii\httpclient\Client::$parsers. Dzięki tym polom można dodać własne typy formatowania lub zmienić standardowe. Dla przykładu:

use yii\httpclient\Client;

$client = new Client([
    'formatters' => [
        'myformat' => 'app\components\http\MyFormatter', // dodaj nowy formater
        Client::FORMAT_XML => 'app\components\http\MyXMLFormatter', // przeciąż domyślny formater XML
    ],
]);

Tworząc własny parser należy zaimplementować yii\httpclient\ParserInterface, a tworząc formater - yii\httpclient\FormatterInterface. Przykładowo:

use yii\httpclient\FormatterInterface;
use yii\httpclient\ParserInterface;
use yii\httpclient\Response;

class ParserIni implements ParserInterface
{
    public function parse(Response $response)
    {
        return parse_ini_string($response->content);
    }
}

class FormatterIni implements FormatterInterface
{
    public function format(Request $request)
    {
        $request->getHeaders()->set('Content-Type', 'text/ini; charset=UTF-8');

        $pairs = [];
        foreach ($request->data as $name => $value) {
            $pairs[] = "$name=$value";
        }

        $request->setContent(implode("\n", $pairs));
        return $request;
    }
}