Как отправить поля формы с помощью Guzzle 6? - PullRequest
1 голос
/ 06 июля 2019

Я разрабатываю свои модульные тесты для API, созданного в Symfony4

. Читая документацию Guzzle, я сгенерировал следующий код:

Файл SecurityControllerTest.php

    $client = new Client([
        'base_uri' => 'http://localhost/sacrepad/sacrepad-api/public/index.php/',
        'timeout'  => 2.0,
    ]);
    $data = array();
    $data['email'] = 'admin@admin.com';
    $data['password'] = '12345678';
    $data2 = array();
    $data2['json'] = $data;
    $formData = json_encode($data);
    $response = $client->request('POST', 'login', [
        'headers' => ['Content-Type' => 'application/x-www-form-urlencoded'],
        'form_params' => [
            'json' => $formData,
        ]
    ]);
    $body = json_decode($response->getBody(), true);

Файл SecurityController.php

/**
 * @Route("/login", name="login", methods={"POST"})
 */
public function login(Request $request,Helpers $helpers,ValidatorInterface $validator, JwtAuth $jwtauth) {

    $data = array(
        'status' => 'error',
        'code' => 400,
        'msg' => 'data not received'
    );

    $json = $request->request->get('json');
    $params = json_decode($json);
}

Когда я запускаю тесты с помощью команды phpunit, я получаю следующую ошибку:

1) App\Tests\SecurityControllerTest::testAuth GuzzleHttp\Exception\ServerException: Server error: `POST http://localhost/sacrepad/sacrepad-api/public/index.php/login` resulted in a `500 Internal Server Error` response:

Если я изменяю имя запроса:

$json = $request->request->get('json2');

Это работает и возвращает мне следующее:

array(3) {
  ["status"]=>
  string(5) "error"
  ["code"]=>
  int(400)
  ["msg"]=>
  string(18) "data not received"
}

Есть идеи о том, как заставить его работать и отправлять параметры?

1 Ответ

0 голосов
/ 06 июля 2019

я строю класс для работы с жрет

 use Exception;
 use GuzzleHttp\Client;
 use GuzzleHttp\Exception\RequestException;


class Api
{

protected $client;
protected $url;

public function __construct()
{
    $this->client = new Client([
        'verify'=>false
    ]);
    $this->url = 'http://localhost/sacrepad/sacrepad-api/public/';

}

public function get($endpoint, $params = [], $headers = [])
{
    $response = $this->sendRequest(
        'GET',
        $this->url . $endpoint,
        $params,
        $headers
    );
    return $response;
}

public function post($endpoint, $params = [], $headers = [])
{

    $response = $this->sendRequest(
        'POST',
        $this->url . $endpoint,
        $params,
        $headers
    );

    return $response;
}

public function sendRequest($type, $url, $params = [], $headers = [])
{

    if ($type == 'GET') {
        $data = [
            'query' => $params
        ];
    } elseif ($type == 'FILE') {
        $type = 'POST';
        $data = [
            'multipart' => $params // TODO implements later
        ];
    } else {
        $data = [
            'json' => $params
        ];
    }

    if (!empty($headers)) {
        $data['headers'] = $headers;
    }

    $data['headers']['X-REAL-IP'] = $_SERVER['REMOTE_ADDR'];
    $data['headers']['User-Agent'] = $_SERVER['HTTP_USER_AGENT'];;
    $data['headers']['X-Platform'] = 'web';

    try {


        $response = $this->client->request(
            $type,
            $url,
            $data
        );


        if (in_array($response->getStatusCode(), ['200', '403', '404'])) {
            return json_decode($response->getBody());
        }


        return false;
    } catch (RequestException $re) {

        if (in_array($re->getResponse()->getStatusCode(), ['403', '404', '422'])) {
            return json_decode($re->getResponse()->getBody());
        }
        return json_decode($re->getResponse()->getBody());
    } catch (Exception $e) {
        return false;
    }
}
}

когда я хочу отправить запрос, это будет выглядеть так

$response = (new Api())->post('index.php/',[
        'email'=> 'admin@admin.com',
        'password' => '123456'
    ]);

Теперь он отправит запрос на index.php и отправит данные электронной почты и пароль, надеюсь, это будет полезно

...