Как использовать Goutte для отправки формы и получения окончательного URI?
Цель состоит в том, чтобы заполнить form[id=thisAwesomeRemoteForm][action=#]
на удаленном сайте. Есть только одно поле (input[name=awesomeField]
), а затем необходимо отправить форму. Как последнее требование, пользователь должен быть перенаправлен с моего веб-сайта на этот удаленный веб-сайт, как если бы он отправил форму на удаленный веб-сайт.
Короче говоря, мне нужно, чтобы пользователь мог щелкнуть по моей ссылке, заставить PHP выполнять свою работу и перенаправиться на этот удаленный веб-сайт, как если бы он заполнил и отправил форму на удаленном веб-сайте. Я не должен заставлять пользователя заполнять удаленную форму самостоятельно.
Код на данный момент:
use Goutte\Client;
// ...
public function gotoAction($data)
{
$client = new Client();
$crawler = $client->request('GET', self::MY_URL);
$form = $crawler->filter('form[id=thisAwesomeRemoteForm]')->form();
$form->setValues(array('awesomeField' => $data));
$crawler = $client->submit($form);
return $this->redirect($form->getUri());
}
Пока что я перенаправлен на самый первый URL, где form
а не где form
должно привести к. Поле заполнено правильными данными, хотя.
Является ли мой код правильным для достижения моей цели (и, следовательно, это удаленный веб-сайт, который может использовать JavaScript для отправки формы или что-то еще), или я упускаю что-то довольно очевидное?
1 ответ
Goutte - это, по большому счету, адаптер для Guzzle на Symfony\Browserkit
API. На основе краткого анализа исходного кода Goutte\Client
effectiveUrl()
не используется или переносится Это будет означать, что если бы произошла переадресация, вы бы не "подняли ее".
Вы можете выполнять те же функции достаточно легко, используя базовые компоненты (Guzzle, DomCrawler), используя следующий фрагмент кода:
$client = new GuzzleHttp\Client([
'debug' => true, // only to troubleshoot
);
// Obtain the html page with the form
$request = $client->createRequest('GET', $url);
$response = $client->send($request);
// or $response = $client->get($url);
// create crawler and obtain the form.
$crawler = new Symfony\Component\DomCrawler\Crawler(null, $response->getEffectiveUrl());
$crawler->addContent(
$response->getBody()->__toString(),
$response->getHeader('Content-Type')
);
$form = $crawler->form('form_identifier');
$form->setValues($data_array);
//form submission
$request = $client->createRequest(
$form->getMethod(),
$form->getUrl(),
[
'body' => $form->getPhpValues(),
]);
$response = $client->send($request);