переопределить rawBody перед парсингом JSON

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
an.viktory@gmail.com
Сообщения: 523
Зарегистрирован: 2016.09.05, 23:21

переопределить rawBody перед парсингом JSON

Сообщение an.viktory@gmail.com » 2020.02.12, 23:50

на сервер посылается не json а зашифрованный body из которого потом после расшифровки берется json какой метод мне надо переопределить и Request чтобы работало правильно?

an.viktory@gmail.com
Сообщения: 523
Зарегистрирован: 2016.09.05, 23:21

Re: переопределить rawBody перед парсингом JSON

Сообщение an.viktory@gmail.com » 2020.02.12, 23:55

если просто перехватывать rawData то пишет

Код: Выделить всё

 Previous exception:
  yii\web\HeadersAlreadySentException: Headers already sent in /var/www/zenit-api.local/vendor/symfony/var-dumper/Dumper/AbstractDumper.php on line 176. in /var/www/zenit-api.local/vendor/yiisoft/yii2/web/Response.php:367
  Stack trace:
  #0 /var/www/zenit-api.local/vendor/yiisoft/yii2/web/Response.php(340): yii\web\Response->sendHeaders()

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

Re: переопределить rawBody перед парсингом JSON

Сообщение yiiliveext » 2020.02.13, 00:09

Смотря как передаете, но смысл примерно такой

Код: Выделить всё

'components' => [
    //...
    'request' => [
        //... 
        'on beforeRequest' => function ($event) {
            $request = $event->sender->getRequest();
            $encodedBody = $request->getRawBody();
            $decodedBody = do_my_decoding($encodedBody);
            $request->setRawBody($decodedBody);
        }    
    ]
]

an.viktory@gmail.com
Сообщения: 523
Зарегистрирован: 2016.09.05, 23:21

Re: переопределить rawBody перед парсингом JSON

Сообщение an.viktory@gmail.com » 2020.02.13, 10:24

спасибо, но данный метод не вызывается почему-то

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

Re: переопределить rawBody перед парсингом JSON

Сообщение yiiliveext » 2020.02.13, 10:26

an.viktory@gmail.com писал(а):
2020.02.13, 10:24
спасибо, но данный метод не вызывается почему-то
Промахнулся немного, прямо на приложение вешайте обработчик события.

Код: Выделить всё

'components' => [
    //...
    'request' => [
        //... 
       
    ]
],
 'on beforeRequest' => function ($event) {
            $request = $event->sender->getRequest();
            $encodedBody = $request->getRawBody();
            $decodedBody = do_my_decoding($encodedBody);
            $request->setRawBody($decodedBody);
        }    

an.viktory@gmail.com
Сообщения: 523
Зарегистрирован: 2016.09.05, 23:21

Re: переопределить rawBody перед парсингом JSON

Сообщение an.viktory@gmail.com » 2020.02.13, 10:48

Код: Выделить всё

 public function decryptRequest(ApiTester $I)
    {
        $sslHandler = new SslSecurityHandler();
        $data = json_encode(['key' => 'value']);
        $headers = [
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer manager_token'
        ];
        codecept_debug($headers);
        $client = new Client();
        $response = $client->request('GET', 'http://127.0.0.1:8099/events', [
            'headers' => $headers,
            'post' => $sslHandler->encrypt($data)
        ]);
        if ($response->getStatusCode() == 200) codecept_debug($sslHandler->decrypt($response->getBody()->getContents()));
    }
    
получаю

Код: Выделить всё

                                                                                                                                                                                                                                                                                          
  [GuzzleHttp\Exception\ServerException] Server error: `GET http://127.0.0.1:8099/events` resulted in a `500 Internal Server Error` response:
\<pre>An Error occurred while handling another error:
yii\web\BadRequestHttpException: Invalid JSON data in request body: (truncated...)
  

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

Re: переопределить rawBody перед парсингом JSON

Сообщение yiiliveext » 2020.02.13, 11:06

Ну так вы его декодируете правильно? Дамп сделайте в on beforeRequest.
Хотя не, вам там нужно зашифрованные данные в json оборачивать, так не пропустит.
А может и пропустит, надо глянуть риквест, не помню точно как там.

yiiliveext
Сообщения: 867
Зарегистрирован: 2019.08.13, 01:49

Re: переопределить rawBody перед парсингом JSON

Сообщение yiiliveext » 2020.02.13, 11:37

Не, это в клиенте, оборачивайте в json

Код: Выделить всё

 public function decryptRequest(ApiTester $I)
    {
        $sslHandler = new SslSecurityHandler();
        $data = json_encode(['key' => 'value']);
        $headers = [
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer manager_token'
        ];
        codecept_debug($headers);
        $client = new Client();
        $response = $client->request('GET', 'http://127.0.0.1:8099/events', [
            'headers' => $headers,
            'post' => json_encode(['data' => $sslHandler->encrypt($data)])
        ]);
        if ($response->getStatusCode() == 200) codecept_debug($sslHandler->decrypt($response->getBody()->getContents()));
    }
    

Код: Выделить всё

'on beforeRequest' => function ($event) {
            $request = $event->sender->getRequest();
            $encodedBody = json_decode($request->getRawBody(), true);
            $decodedBody = do_my_decoding($encodedBody['data']);
            $request->setRawBody($decodedBody);
        }    


Ответить