Guzzle 422 Unprocessable Entity error

Я использую API скриншотов браузера — https://www.browserstack.com/screenshots/api Следующий локон работает:

curl -u "username:password" -H "Content-Type: application/json" -H "Accept: application/json"  -d '{"browsers": [{"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"}], "url": "http://google.com"}' http://www.browserstack.com/screenshots

Однако, когда я пытаюсь выполнить тот же вызов с использованием жрета, я получаю 422 Unprocessable Entity error.

$client = new GuzzleHttp\Client();
$request = $client->post('http://www.browserstack.com/screenshots', [
'headers' => ['Content-type' => 'application/json'],
'auth' =>  ['username', 'password']
]
);

$data = ['browsers' => ['os' => 'Windows', 'os_version' => '7', 'browser_version' => '8.0', 'browser' => 'ie'], 'url' => 'http://google.com'];
$request->setBody($data);
$response = $request->send();
dd($response);

Можете ли вы предложить, как отладить эту проблему?

0

Решение

Чтобы отправить JSON в API-интерфейсы Screenshots, необходимо отформатировать его в виде строки JSON.

$client = new GuzzleHttp\Client();
$request = $client->post('http://www.browserstack.com/screenshots', [
'headers' => ['Content-type' => 'application/json'],
'auth' =>  ['username', 'access_key'],
'body' => '{"browsers": [
{"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"},
{"os": "android", "os_version": "4.4", "device": "HTC One M8", "browser": "Android Browser"}
],
"url": "http://www.lipsum.com"}'
]
);

После этого вы сможете просматривать прогресс на вашем BrowserStack Скриншоты стр.

Для руководства о том, как отправлять POST-запросы с помощью Guzzle, вы можете обратиться к этой документации — https://media.readthedocs.org/pdf/guzzle/latest/guzzle.pdf.

2

Другие решения

У меня была ошибка в методе. Так должно быть $client->createRequest вместо $client->post
Также у меня была ошибка при передаче данных. Браузеры должны быть массивом массивов

Есть еще одна библиотека, которая может быть использована с браузерным стеком и жадностью: https://github.com/ksenzee/browserstack-screenshots-php

$client = new GuzzleHttp\Client();

$request = $client->createRequest('POST', 'http://www.browserstack.com/screenshots', [
'headers' => ['Content-type' => 'application/json'],
'auth' =>  ['user', 'pwd'],
'body' => '{"browsers": [
{"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"},
{"os": "android", "os_version": "4.4", "device": "HTC One M8", "browser": "Android Browser"}
],
"url": "http://www.lipsum.com"}'
]
);
$response = $client->send($request);
dd($response->json());
2

В моем случае в аргументе options используется json (https://es.stackoverflow.com/questions/185183/porqu%C3%A9-guzzle-5-0-lanza-el-error-422-si-estoy-armando-bien-la-consulta#185192), пример:

$client = new GuzzleHttp\Client(['base_url' => 'http://www.browserstack.com/']);
$request = $client->post('screenshots', [
'headers' => ['Content-type' => 'application/json'],
'auth' =>  ['username', 'access_key'],
'json' => '{"browsers": [
{"os": "Windows", "os_version": "7", "browser_version": "8.0", "browser": "ie"},
{"os": "android", "os_version": "4.4", "device": "HTC One M8", "browser": "Android Browser"}
],
"url": "http://www.lipsum.com"}'
]
);
0